vauditdemo代码审计记录


vauditDemo代码审计

本片博客记录vauditDemo的代码审计过程,初学代码审计,记录下来方便回看。vauditDemo地址:https://github.com/virink/VAuditDemo, 这个是大牛virink写的一款练习代码审计的靶场,作者本人也有配套的视频教程,配合食用,味道更佳。

通读源码

对于这种代码不是很多的CMS,通读源码未尝不是一个好方法,在读源码的过程中能够更好的了解整个CMS的架构以及业务逻辑,为接下来的代码审计铺平道路。靶场作者在课上也提到了这种方法。

靶场整体框架

├── about.inc                                     ---说明信息
├── admin                                           ---管理员目录
│   ├── captcha.php
│   ├── delAdmin.php
│   ├── delUser.php
│   ├── index.php
│   ├── logCheck.php
│   ├── login.php
│   ├── manageAdmin.php
│   ├── manageCom.php
│   ├── manage.php
│   ├── manageUser.php
│   ├── php_errors.log
│   └── ping.php
├── css                                                   --- css文件
│   ├── bootstrap.css
│   ├── bootstrap.min.css
│   ├── bootswatch.less
│   ├── bootswatch.min.css
│   └── variables.less
├── footer.php                              ---页脚
├── header.php                           ----页头
├── images                                    ---图片目录
│   └── default.jpg
├── index.php                              ---入口文件
├── install                                      ---安装文件
│   ├── install.php
│   └── install.sql
├── js                                               ---js文件
│   ├── bootstrap.min.js
│   ├── bootswatch.js
│   ├── bsa.js
│   └── check.js
├── messageDetail.php           ---留言详情页面
├── message.php                       ---留言页面
├── messageSub.php               ---留言页面
├── search.php                           ----搜索页面
├── sys                                            ---配置目录
│   ├── config.php
│   ├── install.lock
│   └── lib.php
├── uploads                              -----图片上传目录
└── user                                     -----普通用户目录
    ├── avatar.php
    ├── edit.php
    ├── logCheck.php
    ├── login.php
    ├── logout.php
    ├── regCheck.php
    ├── reg.php
    ├── updateAvatar.php
    ├── updateName.php
    ├── updatePass.php
    └── user.php

1.入口文件index.php

2019-12-2-17-8-52

首先包含了config.php和header.php,然后就是包含了关于页面,入口文件很简单,没啥好说的,但要注意的是这里存在include函数,可能有任意文件包含的风险。

2.配置文件config.php

2019-12-2-17-17-48

检查当前目录下是否存在install.lock文件,不存在的话就跳转到install.php页面,然后包含了lib.php文件,数据库的配置信息也在此文件中。

3.lib.php

2019-12-2-17-22-50

此文件下主要是一些过滤函数用来过滤用户输入,这些过滤函数可能存在bypass的可能。

注意这里的sec函数对全局GET,POST,COOKIE等输入做了过滤。

4.header.php

2019-12-2-17-24-39

根据session判断是普通用户还是管理员,将其的名字显示到页面上,然后就是登录和注册链接。

5.reg.php

2019-12-2-17-32-4

主要是一些表单信息,信息提交到regCheck.php去做校验。

6.regCheck.php

2019-12-2-17-44-28

使用clean_input函数过滤了用户注册的用户名和密码,防止注册含有特殊字符的用户名,这里可以考虑bypass clean_input函数。

7.user.php

2019-12-3-10-49-28

根据username从数据库中查询对应的userid。

8.message.php

2019-12-3-10-56-38

从数据库中获取留言信息展示到页面上,这里的用户名和留言内容都使用了htmlspecialchars转义,基本排除了留言板存在xss的可能。

9.messagesub.php

2019-12-3-11-0-13

将用户留言信息插入到数据库中,使用cleaninput函数过滤了留言信息,但是这里可能存在bypass注入。

10.search.php

2019-12-3-11-4-38

根据用户输入搜索留言,这里使用了sec函数对用户输入进行了过滤。

以上就是重要代码的通读,接下来详解每个漏洞的形成过程。

安装问题

此靶场在使用前需要先安装,其实安装就是创建数据库并写入一些sql语句的过程,此安装文件在判断数据库已经安装完成后并未直接退出,导致下面的代码依旧可以执行,存在敏感信息泄露。

install.php

2019-12-3-11-18-21

复现:

使用burpsuite抓包,访问install.php,查看响应结果。

2019-12-3-14-26-41

render后的结果:

2019-12-3-14-27-16

可看到已经泄露了一些敏感信息。

命令注入

在admin目录下有一个ping.php文件,这个页面的功能是在后台执行ping命令。

2019-12-3-17-7-20

执行正常的命令:

2019-12-3-17-9-10

查看ping.php文件:

2019-12-3-17-10-3

代码并未对target做任何过滤,这样就可以进行命令拼接从而达到命令执行的效果。

2019-12-3-17-11-30

SQL注入

全局搜索查看可能存在注入的语句:

2019-12-3-17-44-38

转到messageDetail.php

2019-12-3-17-47-4

使用sqlwaf函数对id进行了过滤,查看sqlwaf函数:

转到lib.php

2019-12-3-17-48-28

这个函数对常见的sql注入语句进行了替换。

这里将||替换为空字符串,那不就可以使用sele||ct这种方式去绕过对select的过滤。

2019-12-3-22-33-54

存储型XSS

2019-12-4-10-53-48

有个管理员可以查看普通用户的用户名和ip地址的页面,我们看下用户名和ip地址分别是怎么获取的。

转到manageUser.php:

2019-12-4-10-56-29

是从数据库中查询出来的,但是用户名经过了htmlspecialchars的转义,继续查找ip地址是怎么传入数据库的。

转到logCheck.php:

2019-12-4-11-2-4

login_ip是使用get_client_ip函数获取的,并且经过了sqlwaf函数的过滤。

继续查看get_client_ip函数:

转到lib.php:

2019-12-4-11-3-49

此函数从http头信息中提取HTTP_CLIENT_IP或者HTTP_X_FORWARDED_FOR等可以标记客户端地址的字段。

那么就可以伪造这些信息,进而达到xss的效果。

修改http头中的Client-IP值:

2019-12-4-12-40-30

普通用户登录后这个值就会保存到数据库中,当管理员去后台查看时,这个值就会展示到页面上,进而引起XSS.

2019-12-4-12-42-41

2019-12-4-12-44-5

登录爆破

管理员的登录页面存在验证码,当需要爆破密码进行登录时就需要识别验证码或者绕过验证码。

转到admin/login.php:

2019-12-4-12-52-52

验证码是由captcha.php生成的,继续转到admin/logCheck.php:

2019-12-4-13-8-19

可以看到提交的验证码是与session中的验证码作比较的,而session中的验证码是由captcha.php生成的。

2019-12-4-13-9-49

若果不让其访问captcha.php,那$_SESSION['captcha']=null , 这样不就绕过了验证码的限制吗?

登录并使用burp抓包:

2019-12-4-13-15-49

将请求包中的Cookie删除,这样重放的时候新seesion中的$_SESSION[‘captcha’]就会为空,所以也需要把captcha参数删除。

2019-12-4-13-25-17

将验证码和Cookie去掉,重放跳转到manage页面,说明绕过验证码成功,接下来就是正常的去爆破了。

任意文件读取

转到avatar.php

2019-12-4-13-41-36

存在file_get_contents函数,这个函数控制不好的话就会造成任意文件读取的发生。

跟踪$_SESSION['avatar']来到user/logCheck.php。

2019-12-4-13-48-25

$_SESSION['avatar']是从数据库中获取的,继续跟踪user_avatar看其是怎么插入到数据库中的。

来到updateAvatar.php中发现了其插入语句:

2019-12-4-13-52-46

变量$avatar是由上传路径+时间戳+文件名三部分组成的,其中文件名是可控的。

构造payload :

', user_avatar = '../sys/config.php' WHERE user_name = 'test'#.png  ,

将avatar更改为../sys/config.php即可读取这个文件的内容。

burp抓取头像上传的数据包然后改包:

2019-12-4-14-43-47

上传后发现数据库中的数据变成了这样的:

2019-12-4-14-44-31

原因是文件名中不能包含路径信息,将文件名转换为16进制,重新上传。

2019-12-4-14-55-9

这样就成功了:

2019-12-4-14-55-40

接下来登录然后读取头像文件就可以看到config.php文件的内容。

2019-12-4-15-21-49

同样这个任意文件读取也可以访问任意外部链接的内容,从而达到SSRF的效果。

文件包含

转到index.php,使用了include函数包含about.inc文件。

2019-12-4-15-41-52

这里限制了后缀只能是.inc格式的,可以尝试使用伪协议绕过,关于伪协议的使用请参考:https://lorexxar.cn/2016/09/14/php-wei/

我这里使用phar伪协议。

在上传文件处上传一个一句话木马,注意需要将木马文件后缀该为.inc,并将其压缩,压缩文件后缀该为.png格式。

2019-12-4-15-47-17

上传test.png,观察其上传时间,并将这个时间转换为时间戳:

2019-12-4-15-51-50

上传文件的名字是按照如下规则重命名的:

2019-12-4-15-53-7

所以我们上传的文件为:/uploads/u_1575446707_test.png

使用phar读取压缩包里面的test.inc文件:

payload为:phar://uploads/u_1575446707_test.png/test

2019-12-4-16-6-38

成功上传一句话并执行命令成功。

越权

后台有个更改用户名的地方,我们来看看这里是否存在越权的问题:

2019-12-4-16-21-22

跟踪edit.php来到updateName.php:

2019-12-4-16-22-32

2019-12-4-16-23-25

updateName.php中发现了一个奇怪的问题,更新用户名时竟然不从session中获取user_id,而是可以接收用户post的id。这样就导致了可以修改任意用户用户名的越权问题。

来修改下用户sss的用户名:

2019-12-4-16-27-57

2019-12-4-16-36-58

2019-12-4-16-37-18

可看到已将其用户名修改。

二次截断注入

二次注入简而言之就是在存在单引号的情况下,利用双条件查询,利用前一个条件去闭合单引号,后一个条件就可以成为我们的payload。这里的关键是闭合单引号。

来到messageSub.php:

这个页面处理用户的留言信息,会将用户的留言信息提交到数据库中,使用了clean_input函数,但是并未使用sqlwaf函数过滤用户输入。

2019-12-4-16-58-51

cleaninput这个函数很奇怪,先是使用了stripslashes删除反斜杠,然后又使用mysql_real_escape_string()给特殊字符加上反斜杠。O__O “…

如果我们能够注册一个用户名里面包含\,那就可以闭合valves中的第一个单引号,后面就可以插入payload的了。

payload为:,(select user()),now());#

来到regCheck.php:

2019-12-4-21-27-5

使用clean_input函数过滤了用户名。

我们注册一个abcd\用户:

2019-12-4-21-31-30

2019-12-4-21-32-33

界面显示的是abcd\\,查看数据库是abcd\,说明用户名已注册成功。

然后退出重新登陆:

2019-12-4-21-35-44

页面显示error,不必理会,现在已经登陆成功了。

在留言页面填写payload:

2019-12-4-23-26-49

留言成功后,留言板即可显示payload执行的结果:

2019-12-4-23-27-46

至此全部漏洞的代码审计已经说明完毕,代码审计本是一个复杂的过程,文中有没说清楚的可结合视频学习。


文章作者: darkless
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 darkless !
评论
 上一篇
从微信群不良广告到酷我音乐存储型XSS再到乐视url跳转 从微信群不良广告到酷我音乐存储型XSS再到乐视url跳转
以下文章中提到的所有漏洞都已经报相关厂商并已修复 事件起因在一个满是黑客(安全从业者)的群里,竟然混入了一个不明飞行物,他还发了个极具诱惑的广告: 我仔细一看(马赛克后面的文字请自行瞎想),感觉事情不对,点开其中的广告仔细欣赏了一番,
下一篇 
deepin 微信图片打开空白解决办法 deepin 微信图片打开空白解决办法
在ubuntu上安装deepin微信后,打开别人发送的图片是空白的,无法显示。 网上查了下,deepin论坛给的解决办法如下: https://bbs.deepin.org/forum.php?mod=viewthread&tid=
  目录