insert_into注入

开卷看题

作者终于有良心了,不好意思直接给源码就说是Python的

结合效果来看源码就是index的

代码分析

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
<?php
error_reporting(0);

function getIp()
{
$ip = '';
// 读取IP,先尝试读取X-Forwarded-For字段,如果为空则使用源IP
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}

// 重点:以逗号切割IP并且返回第一个子串,也就是说第一个逗号之后的内容会被截断
$ip_arr = explode(',', $ip);
return $ip_arr[0];

}

$host = "localhost";
$user = "";
$pass = "";
$db = "";

$connect = mysql_connect($host, $user, $pass) or die("Unable to connect");

mysql_select_db($db) or die("Unable to select database");

$ip = getIp();
echo 'your ip is :' . $ip;

// 将IP插入到数据库中,只能时间盲注
$sql = "insert into client_ip (ip) values ('$ip')";
mysql_query($sql);
?>

总计一下:以逗号对XFF头进行截断然后插入到数据库中

摸索注入

既然是以逗号作为截断符,payload中就不能使用逗号了,对于一些常用的时间盲注函数也就不能按照传统方式调用了

采用的无逗号方案:

  • 采用case when 代替if进行时间盲注

  • 采用substr([str] from [from] for [len])来代替传统方式

  • 用limit [len] offset [offset] 代替 limit [offset],[len]

解决了逗号的问题接下来就可以放心的注入了

脚本编写

由于时间盲注非常考验耐心所以手工测试行不通,准备Python吧

首先说明一下,有些WP上来就猜到了flag在flag表的flag列,首先这确实是做多了CTF的经验,不过从SQL注入角度来说直接猜还是略显不足的,所以我们还是从头开始编写脚本逐步探测数据库,数据表,字段最后提取行数据

1
2
import request
# 脚本丢了,稍后发吧

后记

绕过WAF和脚本编写能力很重要