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

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

先单引号让他报错

SQLi-LABS 学习SQL注入(less 23-less38 )_第1张图片
图片.png

可以知道是单引号闭合。
然后发现--和#都被过滤了
图片.png

那么就只能用闭合后面引号的方法,根据报错可以知道语句 为id='$ID' limit 0,1
那么可以这样闭合 id='1' or '1'='1' limit 0,1或者是 id='1' and '1'='1' limit 0,1
SQLi-LABS 学习SQL注入(less 23-less38 )_第2张图片
图片.png

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

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

SQLi-LABS 学习SQL注入(less 23-less38 )_第3张图片
图片.png
真正有跟数据库交互的就login_create.php,login.php,pass_change.php这三个文件
PHP mysql_real_escape_string() 函数
login.php
图片.png
login_create.php
SQLi-LABS 学习SQL注入(less 23-less38 )_第4张图片
图片.png
pass_change.php
SQLi-LABS 学习SQL注入(less 23-less38 )_第5张图片
图片.png
SQLi-LABS 学习SQL注入(less 23-less38 )_第6张图片
图片.png

发现只有$_SESSION["username"]没有被过滤,这个SQL语句是用来更改密码的,而且mysql_real_escape_string()函数只会过滤以下字符
\x00
\n
\r
\
'
"
\x1a
而注释是不会过滤掉的,我们可以注册一个包含注释符号的username,然后用这个username更改密码的时候会被注入到update语句中,更改注释前面的用户名的密码。

SQLi-LABS 学习SQL注入(less 23-less38 )_第7张图片
图片.png
比如我们想更改用户名为Dummy的密码,我们可以注册一个username=Dummy' -- k
图片.png
然后登陆更改密码为456
SQLi-LABS 学习SQL注入(less 23-less38 )_第8张图片
图片.png
而你会发现Dummy的密码变为了456,而Dummy' -- k的密码还是123
SQLi-LABS 学习SQL注入(less 23-less38 )_第9张图片
图片.png

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

SQLi-LABS 学习SQL注入(less 23-less38 )_第10张图片
图片.png

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

单引号报错

图片.png

发现是单引号闭合,注释也正常
SQLi-LABS 学习SQL注入(less 23-less38 )_第11张图片
图片.png
发现被过滤了and和or
图片.png
SQLi-LABS 学习SQL注入(less 23-less38 )_第12张图片
图片.png
正则表达式模式修饰符开了i模式不能用大小写绕过。
SQLi-LABS 学习SQL注入(less 23-less38 )_第13张图片
图片.png
我们可以用&&代替and,||代替or。
SQLi-LABS 学习SQL注入(less 23-less38 )_第14张图片
图片.png
SQLi-LABS 学习SQL注入(less 23-less38 )_第15张图片
图片.png
&要换成%26url编码

双写也是可以的,因为他只过滤一次。
SQLi-LABS 学习SQL注入(less 23-less38 )_第16张图片
图片.png
SQLi-LABS 学习SQL注入(less 23-less38 )_第17张图片
图片.png

这道题用union也是可以的。

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

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

SQLi-LABS 学习SQL注入(less 23-less38 )_第18张图片
图片.png
SQLi-LABS 学习SQL注入(less 23-less38 )_第19张图片
图片.png

发现是数字型注入
SQLi-LABS 学习SQL注入(less 23-less38 )_第20张图片
图片.png

延时注入 http://127.0.0.1/sqli-labs-master/Less-25a/?id=1 %26%26 if(length(database)=8,1,sleep(5))
联合查询
SQLi-LABS 学习SQL注入(less 23-less38 )_第21张图片
图片.png

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

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

图片.png
发现被过滤了and,or,单行多行注释,/ ,空格,没有过滤单引号。
SQLi-LABS 学习SQL注入(less 23-less38 )_第22张图片
图片.png
对于注释和结尾字符的我们此处只能利用构造一个 ' 来闭合后面到 ' ;对于空格,有较多的方法:
%09 TAB键(水平)
%0a 新建一行
%0c 新的一页
%0d return功能
%0b TAB键(垂直)
%a0 空格(应该是php转化的时候是一个特殊字符,然后mysql会解释为空白字符)
SQLi-LABS 学习SQL注入(less 23-less38 )_第23张图片
图片.png
查数据库名
SQLi-LABS 学习SQL注入(less 23-less38 )_第24张图片
图片.png
查列名,不要忘记information中的or被过滤了
SQLi-LABS 学习SQL注入(less 23-less38 )_第25张图片
图片.png

SQLi-LABS 学习SQL注入(less 23-less38 )_第26张图片
图片.png
查字段
SQLi-LABS 学习SQL注入(less 23-less38 )_第27张图片
图片.png
查数据,不要忘了passowrd中的or
SQLi-LABS 学习SQL注入(less 23-less38 )_第28张图片
图片.png

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

跟25的区别是不会报错,闭合方式变为('变量')。
SQLi-LABS 学习SQL注入(less 23-less38 )_第29张图片
图片.png

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

id=and1,or1,--1,1' ' ',union1,UnIon1,select1,SeLect1,判断出过滤了注释、select、union和空格,没有过滤and和or,以及可以用大小写绕过。

SQLi-LABS 学习SQL注入(less 23-less38 )_第30张图片
图片.png
id=0,等于-1的话负号被过滤掉还是会显示union前面的数据,不会显示后面的数据。用where '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
SQLi-LABS 学习SQL注入(less 23-less38 )_第31张图片
图片.png

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

这个跟less 27的区别是不会显示报错语句,还是个双引号闭合方式。所以关键的是去确认他的闭合方式。
id=and1,or1,--1,1' ' ',union1,UnIon1,select1,SeLect1,判断出过滤了注释、select、union和空格,没有过滤and和or,以及可以用大小写绕过。当我们用单引号闭合的时候显示的是正确的

SQLi-LABS 学习SQL注入(less 23-less38 )_第32张图片
图片.png
and 1=0依然显示正确,说明不是单引号闭合
SQLi-LABS 学习SQL注入(less 23-less38 )_第33张图片
图片.png
而and 1=1双引号显示正确,and 1=0双引号显示错误。初步确定是双引号闭合
SQLi-LABS 学习SQL注入(less 23-less38 )_第34张图片
图片.png
基本可以确定是双引号闭合
SQLi-LABS 学习SQL注入(less 23-less38 )_第35张图片
图片.png

其他操作同less 27
SQLi-LABS 学习SQL注入(less 23-less38 )_第36张图片
图片.png

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

id=and1,or1,--1,1' ' ',union1,UnIon1,select1,SeLect1,判断出过滤了注释、select、union和空格,没有过滤and和or,以及可以用大小写绕过。
基本可以确定是('变量')闭合

SQLi-LABS 学习SQL注入(less 23-less38 )_第37张图片
图片.png
SQLi-LABS 学习SQL注入(less 23-less38 )_第38张图片
图片.png

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

id=and1,or1,--1,1' ' ',union1,UnIon1,select1,SeLect1,判断出都没有被过滤。然后就是判断闭合方式。

不是单引号闭合
SQLi-LABS 学习SQL注入(less 23-less38 )_第39张图片
图片.png
也不是双引号闭合
SQLi-LABS 学习SQL注入(less 23-less38 )_第40张图片
图片.png

是('闭合')
SQLi-LABS 学习SQL注入(less 23-less38 )_第41张图片
图片.png
语句发现报错
SQLi-LABS 学习SQL注入(less 23-less38 )_第42张图片
图片.png
发现union select中间有空格会被过滤掉,其他语句没问题
SQLi-LABS 学习SQL注入(less 23-less38 )_第43张图片
图片.png
在union和select中间加上%a0
SQLi-LABS 学习SQL注入(less 23-less38 )_第44张图片
图片.png
源码中过滤都被注释了,我们把注释除去。
SQLi-LABS 学习SQL注入(less 23-less38 )_第45张图片
图片.png

然后还是老方法,发现过滤了select,并且大小写也绕不过去了,没有过滤union,过滤了注释,没有过滤单引号。过滤了空格,并且初步判断为单引号闭合。
SQLi-LABS 学习SQL注入(less 23-less38 )_第46张图片
图片.png
select无法绕过,union也起不了作用,又不会显示报错信息,那么只能用盲注。
SQLi-LABS 学习SQL注入(less 23-less38 )_第47张图片
图片.png

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

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

SQLi-LABS 学习SQL注入(less 23-less38 )_第48张图片
图片.png
在源文件夹中发现了login.php,发现什么闭合方式都不行,可是源代码中是单引号闭合
SQLi-LABS 学习SQL注入(less 23-less38 )_第49张图片
图片.png

WAF
MYSQL注入天书之服务器(两层)架构
在SQL注入过程中主流的WAF绕过技术:
1.转换特征字符大小写
2.利用注释绕过
3.编码特征字符绕过
4.分隔重写特征字符绕过
5.利用截断字符绕过
6.变换变量位置绕过
7.针对域名保护的绕近
8.超大数据包绕过
9.转换数据提交方式绕过
10.HPP(HTTP参数污染)绕过

SQLi-LABS 学习SQL注入(less 23-less38 )_第50张图片
图片.png

index.php?id=1&id=2
Explain:apache(php)解析最后一个参数,即显示id=2的内容。Tomcat(jsp)解析第一个参数,即显示id=1的内容。Tomcat功能类似一个WAF
所以我们要传入两个id,第一个用来欺骗waf,第二个用来传送给apache。waf是只允许输入数字的,我们在输入数字的时候先给waf看然后检测正常后才转发给我们需要访问的页面

发现是单引号闭合
SQLi-LABS 学习SQL注入(less 23-less38 )_第51张图片
图片.png
绕过WAF注入什么的就比较简单了
SQLi-LABS 学习SQL注入(less 23-less38 )_第52张图片
图片.png

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

跟less 29一样,单引号变成双引号
SQLi-LABS 学习SQL注入(less 23-less38 )_第53张图片
图片.png

Less - 31 Protection with WAF用WAF防护

根据报错知道是("变量")闭合
图片.png
SQLi-LABS 学习SQL注入(less 23-less38 )_第54张图片
图片.png

Less - 32 Bypass addslashes()绕过addslashes

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

图片.png

发现是单引号闭合。联合查询
SQLi-LABS 学习SQL注入(less 23-less38 )_第55张图片
图片.png

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没什么区别
SQLi-LABS 学习SQL注入(less 23-less38 )_第56张图片
图片.png

32的函数
SQLi-LABS 学习SQL注入(less 23-less38 )_第57张图片
图片.png

33的函数
SQLi-LABS 学习SQL注入(less 23-less38 )_第58张图片
图片.png

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

各种姿势都绕不过去

SQLi-LABS 学习SQL注入(less 23-less38 )_第59张图片
图片.png
应该还是单引号双引号反斜杠被转义了。
这里是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
SQLi-LABS 学习SQL注入(less 23-less38 )_第60张图片
图片.png

Less-35

根据报错发现单引号被转义了,还是个数字型注入,根本不需要闭合
SQLi-LABS 学习SQL注入(less 23-less38 )_第61张图片
图片.png

那就比较好办了
SQLi-LABS 学习SQL注入(less 23-less38 )_第62张图片
图片.png
SQLi-LABS 学习SQL注入(less 23-less38 )_第63张图片
图片.png

Less-36

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

SQLi-LABS 学习SQL注入(less 23-less38 )_第64张图片
图片.png
根据报错发现是单引号闭合,跟前面的没什么区别
SQLi-LABS 学习SQL注入(less 23-less38 )_第65张图片
图片.png

看源代码用了一个函数mysql_real_escape_string()
SQLi-LABS 学习SQL注入(less 23-less38 )_第66张图片
图片.png

mysql_real_escape_string会转义如下字符
SQLi-LABS 学习SQL注入(less 23-less38 )_第67张图片
图片.png
转义成功返回这些字符串,失败返回false。

Less -37

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

 $uname = mysql_real_escape_string($uname1);  
 $passwd= mysql_real_escape_string($passwd1); 
SQLi-LABS 学习SQL注入(less 23-less38 )_第68张图片
图片.png

Less-38

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

SQLi-LABS 学习SQL注入(less 23-less38 )_第69张图片
图片.png
SQLi-LABS 学习SQL注入(less 23-less38 )_第70张图片
图片.png

发现有点简单就看一下源代码,发现
SQLi-LABS 学习SQL注入(less 23-less38 )_第71张图片
图片.png

PHP mysqli_more_results() 函数
PHP mysqli_multi_query() 函数
mysqli_store_result
堆叠注入(Stacked injections)
Stacked injections:堆叠注入。从名词的含义就可以看到应该是一堆sql语句(多条)一起执行。而在真实的运用中也是这样的,我们知道在mysql中,主要是命令行中,每一条语句结尾加 ; 表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做stacked injection。
总的来说就是mysqli_mylti_query()这个函数可以执行用;分隔的多条语句。
SQLi-LABS 学习SQL注入(less 23-less38 )_第72张图片
图片.png
SQLi-LABS 学习SQL注入(less 23-less38 )_第73张图片
图片.png

你可能感兴趣的:(SQLi-LABS 学习SQL注入(less 23-less38 ))