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 (二次注入)
这是一个完整的注册登陆以及改密网站
PHP mysql_real_escape_string() 函数
login.php
发现只有$_SESSION["username"]没有被过滤,这个SQL语句是用来更改密码的,而且mysql_real_escape_string()函数只会过滤以下字符
\x00
\n
\r
\
'
"
\x1a
而注释是不会过滤掉的,我们可以注册一个包含注释符号的username,然后用这个username更改密码的时候会被注入到update语句中,更改注释前面的用户名的密码。
可能有人会说注册的时候不是被过滤了单引号吗。
我们admin' -- 变成了admin' -- ,还是正常闭合了,但是存进数据库的时候他依旧是一个单引号。(转义只是暂时在这里使它失去了单引号的作用,但它还是表示单引号)
less 25 Trick with OR & AND (过滤了or和and)
单引号报错
发现是单引号闭合,注释也正常
这道题用union也是可以的。
less 25a Trick with OR & AND Blind (过滤了or和and的盲注)
跟less25一样只不过错误信息被屏蔽了。and和or也被过滤了。而注释没有被过滤
发现是数字型注入
延时注入
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' ' ' '
%09 TAB键(水平)
%0a 新建一行
%0c 新的一页
%0d return功能
%0b TAB键(垂直)
%a0 空格(应该是php转化的时候是一个特殊字符,然后mysql会解释为空白字符)
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的)
id=and1,or1,--1,1' ' ',union1,UnIon1,select1,SeLect1,判断出过滤了注释、select、union和空格,没有过滤and和or,以及可以用大小写绕过。
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的区别是不会显示报错语句,还是个双引号闭合方式。所以关键的是去确认他的闭合方式。
id=and1,or1,--1,1' ' ',union1,UnIon1,select1,SeLect1,判断出过滤了注释、select、union和空格,没有过滤and和or,以及可以用大小写绕过。当我们用单引号闭合的时候显示的是正确的
其他操作同less 27
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,以及可以用大小写绕过。
基本可以确定是('变量')闭合
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,判断出都没有被过滤。然后就是判断闭合方式。
Less-29 GET-Error based- IMPIDENCE MISMATCH-Having a WAF in front of web application基于WAF的一个错误
单引号报错发现是单引号闭合,没有过滤注释,空格,引号,unsion,select,and,or
WAF
MYSQL注入天书之服务器(两层)架构
在SQL注入过程中主流的WAF绕过技术:
1.转换特征字符大小写
2.利用注释绕过
3.编码特征字符绕过
4.分隔重写特征字符绕过
5.利用截断字符绕过
6.变换变量位置绕过
7.针对域名保护的绕近
8.超大数据包绕过
9.转换数据提交方式绕过
10.HPP(HTTP参数污染)绕过
index.php?id=1&id=2
Explain:apache(php)解析最后一个参数,即显示id=2的内容。Tomcat(jsp)解析第一个参数,即显示id=1的内容。Tomcat功能类似一个WAF
所以我们要传入两个id,第一个用来欺骗waf,第二个用来传送给apache。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没什么区别32的函数
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会转义如下字符
Less -37
跟less 34一样,只是过滤函数不同
$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()这个函数可以执行用;分隔的多条语句。