SQLi-LABS 学习SQL注入2

引言

SQLi-LABS 学习SQL注入(less 23-less38 )

less 23 GET - Error based - strip comments (基于错误的,过滤注释的GET型)

先单引号让他报错

可以知道是单引号闭合。
然后发现–和#都被过滤了

那么就只能用闭合后面引号的方法,根据报错可以知道语句为id='$ID' limit 0,1
那么可以这样闭合id='1' or '1'='1' limit 0,1
或者是id='1' and '1'='1' limit 0,1

less-24 - Second Degree Injections Real treat -Store Injections (二次注入)

这是一个完整的注册登陆以及改密网站

真正有跟数据库交互的就login_create.php,login.php,pass_change.php这三个文件

PHP mysql_real_escape_string() 函数

login.php

login_create.php

pass_change.php


发现只有$_SESSION["username"]没有被过滤,这个SQL语句是用来更改密码的,而且mysql_real_escape_string()函数只会过滤以下字符

1
2
3
4
5
6
7
\x00
\n
\r
\
'
"
\x1a

而注释是不会过滤掉的,我们可以注册一个包含注释符号的username,然后用这个username更改密码的时候会被注入到update语句中,更改注释前面的用户名的密码。

比如我们想更改用户名为Dummy的密码,我们可以注册一个username=Dummy' -- k

然后登陆更改密码为456

而你会发现Dummy的密码变为了456,而Dummy' -- k的密码还是123

可能有人会说注册的时候不是被过滤了单引号吗。
我们admin' --变成了admin' --,还是正常闭合了,但是存进数据库的时候他依旧是一个单引号。(转义只是暂时在这里使它失去了单引号的作用,但它还是表示单引号)

less 25 Trick with OR & AND (过滤了or和and)

单引号报错

发现是单引号闭合,注释也正常

发现被过滤了and和or

正则表达式模式修饰符
开了 i 模式不能用大小写绕过。

我们可以用&&代替and,||代替or。

&要换成%26url编码

双写也是可以的,因为他只过滤一次。

这道题用union也是可以的。

less 25a Trick with OR & AND Blind (过滤了or和and的盲注)

跟less25一样只不过错误信息被屏蔽了。and和or也被过滤了。而注释没有被过滤

发现是数字型注入

延时注入

1
http://127.0.0.1/sqli-labs-master/Less-25a/?id=1 %26%26 if(length(database)=8,1,sleep(5))

联合查询

less 26 Trick with comments and space (过滤了注释和空格的注入)

通过输入and1,or1,--1,/*1,/1,1,1' ' ' '

发现被过滤了and,or,单行多行注释,/ ,空格,没有过滤单引号。

对于注释和结尾字符的我们此处只能利用构造一个 ‘ 来闭合后面到 ‘ ;对于空格,有较多的方法:

1
2
3
4
5
6
%09 TAB键(水平)
%0a 新建一行
%0c 新的一页
%0d return功能
%0b TAB键(垂直)
%a0 空格(应该是php转化的时候是一个特殊字符,然后mysql会解释为空白字符)

查数据库名

查列名,不要忘记information中的or被过滤了

查字段

查数据,不要忘了password中的or

less 26a GET - Blind Based - All your SPACES and COMMENTS belong to us(过滤了空格和注释的盲注)

跟25的区别是不会报错,闭合方式变为(‘变量’)。

less 27 GET - Error Based- All your UNION & SELECT belong to us (过滤了union和select的)

1
id=and1,or1,--1,1' ' ',union1,UnIon1,select1,SeLect1,

判断出过滤了注释、select、union和空格,没有过滤and和or,以及可以用大小写绕过。

id=0,等于-1的话负号被过滤掉还是会显示union前面的数据,不会显示后面的数据。用where ‘1’=’1’闭合后面的双引号

1
http://127.0.0.1/sqli-labs-master/Less-27/?id=0'%a0UnIon%a0SeLect%a01,group_concat(username,password,0x3a),3%a0from%a0users%a0where%a0'1'='1

less 27a GET - Blind Based- All your UNION & SELECT belong to us

这个跟less 27的区别是不会显示报错语句,还是个双引号闭合方式。所以关键的是去确认他的闭合方式。

1
id=and1,or1,--1,1' ' ',union1,UnIon1,select1,SeLect1,

判断出过滤了注释、select、union和空格,没有过滤and和or,以及可以用大小写绕过。当我们用单引号闭合的时候显示的是正确的

and 1=0依然显示正确,说明不是单引号闭合

而and 1=1双引号显示正确,and 1=0双引号显示错误。初步确定是双引号闭合

基本可以确定是双引号闭合

其他操作同less 27

less 28 GET - Error Based- All your UNION & SELECT belong to us String-Single quote with parenthesis基于错误的,有括号的单引号字符型,过滤了union和select等的注入

1
id=and1,or1,--1,1' ' ',union1,UnIon1,select1,SeLect1,

判断出过滤了注释、select、union和空格,没有过滤and和or,以及可以用大小写绕过。
基本可以确定是(‘变量’)闭合

less 28a GET - Bind Based- All your UNION & SELECT belong to us String-Single quote with parenthesis基于盲注的,有括号的单引号字符型,过滤了union和select等的注入

1
id=and1,or1,--1,1' ' ',union1,UnIon1,select1,SeLect1,

判断出都没有被过滤。然后就是判断闭合方式。
不是单引号闭合

也不是双引号闭合

是(‘闭合’)

语句发现报错

发现union select中间有空格会被过滤掉,其他语句没问题

在union和select中间加上%a0

源码中过滤都被注释了,我们把注释除去。

然后还是老方法,发现过滤了select,并且大小写也绕不过去了,没有过滤union,过滤了注释,没有过滤单引号。过滤了空格,并且初步判断为单引号闭合。

select无法绕过,union也起不了作用,又不会显示报错信息,那么只能用盲注。

Less-29 GET-Error based- IMPIDENCE MISMATCH-Having a WAF in front of web application基于WAF的一个错误

单引号报错发现是单引号闭合,没有过滤注释,空格,引号,unsion,select,and,or

在源文件夹中发现了login.php,发现什么闭合方式都不行,可是源代码中是单引号闭合

WAF
MYSQL注入天书之服务器(两层)架构

在SQL注入过程中主流的WAF绕过技术:

1.转换特征字符大小写
2.利用注释绕过
3.编码特征字符绕过
4.分隔重写特征字符绕过
5.利用截断字符绕过
6.变换变量位置绕过
7.针对域名保护的绕近
8.超大数据包绕过
9.转换数据提交方式绕过
10.HPP(HTTP参数污染)绕过


1
index.php?id=1&id=2

Explain:apache(php)解析最后一个参数,即显示id=2的内容。Tomcat(jsp)解析第一个参数,即显示id=1的内容。

Tomcat功能类似一个WAF
所以我们要传入两个id,第一个用来欺骗waf,第二个用来传送给apache。waf是只允许输入数字的,我们在输入数字的时候先给waf看然后检测正常后才转发给我们需要访问的页面。

发现是单引号闭合

绕过WAF注入什么的就比较简单了

Less-30 基于错误的GET型双引号字符型注入

跟less 29一样,单引号变成双引号

Less - 31 Protection with WAF用WAF防护

根据报错知道是(“变量”)闭合

Less - 32 Bypass addslashes()绕过addslashes

单引号双引号都不会报错 应该是被转义了,用宽字节注入%df’报错

发现是单引号闭合。联合查询

addslashes函数单引号,双引号,反斜杠 均被添加斜线
注释:默认地,PHP 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。所以您不应对已转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。

原理:mysql在使用GBK编码的时候,会认为两个字符为一个汉字,例如%aa%5c就是一个汉字(前一个ascii码大于128才能到汉字的范围)。我们在过滤 ‘ 的时候,往往利用的思路是将 ‘ 转换为\’ 。

因此我们在此想办法将 ‘ 前面添加的 \ 除掉,一般有两种思路:1. %df吃掉 \ 具体的原因是urlencode(‘) = %5c%27,我们在%5c%27前面添加%df,形成%df%5c%27,而上面提到的mysql在GBK编码方式的时候会将两个字节当做一个汉字,此事%df%5c就是一个汉字,%27则作为一个单独的符号在外面,同时也就达到了我们的目的。2. 将 ‘ 中的 \ 过滤掉,例如可以构造 %**%5c%5c%27的情况,后面的%5c会被前面的%5c给注释掉。这也是bypass的一种方法。

Less - 33 Bypass addslashes()绕过 addslashes()

跟less-32没什么区别

less-32的函数

less-33的函数

Less - 34 Bypass Add SLASHES(第34节:绕过添加斜杠)

各种姿势都绕不过去

应该还是单引号双引号反斜杠被转义了。
这里是post型的注入漏洞,同样的也是将post过来的内容进行了’的处理。同样要把\给吃掉。而get型的方式我们是以url形式提交的,因此数据会通过URLencode,如何将方法用在post型的注入当中。将utf-8转换为utf-16或utf-32,例如将 ‘ 转为utf-16为’ 。其实就是把在get提交的%df’经过URLencode后变成’直接复制到post中使用。

关于编码:Unicode/UTF-8/UTF-16/UTF-32

Less-35

根据报错发现单引号被转义了,还是个数字型注入,根本不需要闭合

那就比较好办了

Less-36

id=1’,1”,单引号双引号同样被转义了。同样用宽字节注入

根据报错发现是单引号闭合,跟前面的没什么区别

看源代码用了一个函数mysql_real_escape_string()

mysql_real_escape_string会转义如下字符

转义成功返回这些字符串,失败返回false。

Less -37

跟less 34一样,只是过滤函数不同

1
2
$uname = mysql_real_escape_string($uname1);
$passwd= mysql_real_escape_string($passwd1);

Less-38

单引号报错,发现是单引号闭合,而且不会转义单引号

发现有点简单就看一下源代码,发现

PHP mysqli_more_results() 函数
PHP mysqli_multi_query() 函数
mysqli_store_result
堆叠注入(Stacked injections)

Stacked injections:堆叠注入。从名词的含义就可以看到应该是一堆sql语句(多条)一起执行。而在真实的运用中也是这样的,我们知道在mysql中,主要是命令行中,每一条语句结尾加 ; 表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做stacked injection。

总的来说就是mysqli_mylti_query()这个函数可以执行用;分隔的多条语句。

介绍:仅供技术交流学习探讨,请勿用于非法用途。本文部分资源来源于网络,如有侵权请联系版主删除。

-------------本文结束感谢您的阅读-------------
纯属好玩,打赏多少您随意!