这一篇主要总结一下sqlilabs中advanced injection中的用到的各种绕过,也就是less21-less38。
目录
1)数据编码
2)特殊字符、语法关键字过滤
3)存储型注入
4)特殊字符转义与宽字节注入
5)防火墙保护与http参数污染
数据编码
http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-21/ http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-22/
这个是最简单的,就是在普通注入的基础上用响应的编码方式编码一下payload即可,比如sqlilabs上这两个靶站都是用的base64编码。
特殊字符、语法关键字过滤
http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-23/ http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-25/ http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-25a/ http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-26/ http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-26a/ http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-27/ http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-27a/ http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-28/ http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-28a/
出现了的过滤与绕过方式:
1)注释符号被过滤:可以采用以 or 'a'='b 结尾的方式绕过。其实注释本来的作用也就是闭合语句,只要抓住这个核心目标就行。比如如果目标参数是双引号包裹的,就可以用 or "a"="b 结尾来绕过。值得注意的是,由于'-'是注释的一部分也被过滤掉了,会带来其它的一些副作用,因为'-'同时也是减号和负号。
2)空格被过滤:可以用%a0来替代空格分割语句。
3)and和or被过滤:可以用&&和||来替代。值得注意的是,这里也会产生一些副作用,比如password会被过滤成passwd,解决这个副作用的方法是双写or,也就是改用passwoorrd,passwoorrd中or被过滤掉之后就变成了password。
4)union和select等被过滤:根据过滤的具体实现方式,可以尝试用sElect,uniOn等来代替。
以less-26a为例展示一个注入脚本:
import
前面提到过的所有过滤检测与副作用的绕过都体现在了这个脚本里(其实这道题没有这么多过滤):
1)id=100000,负数用不了,改用同样也查询不到的大整数;
2)因为or用不了,password改成了passwoorrd;
3)select改成了sElect;
4)空格使用了%a0替代;
5)因为注释符被过滤,且参数被单引号和括号包裹,结尾用 (%27a%27=%27b 来使语句闭合。
存储型注入(二次注入)
所谓存储型注入,说的是我们先将注入语句存入数据库,再通过其它方式比如查询来触发这些注入语句使它们被执行,最终达到注入效果。
http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-24/
这是sqlilabs中唯一一道相关例题
我们先创建一个这样的账户:
username=admin'#password=2333
创建成功后登录进去改密码:
username=admin'#currentpassword=2333(随便填)newpassword=00000000confirmpassword=00000000
账户admin的密码就被改为了00000000。 这个漏洞的根本原因是,改密码的代码从数据中取数据时直接把admin'#拼接进了sql语句。
特殊字符转义与宽字节注入
常见的转义方式:
1)自定义转义函数,比如:
function
2)调用函数 addslashes()
3)调用函数 mysql_real_escape_string()
它们都可能被宽字节注入绕过。
原理分析:
以单引号'为例,它被转义为',我们的目标是去掉反斜杠,将'逃逸出来。现在我们不输入',而是输入%df',被转义后它变成:%df',也相当于%df%5c%27(%5c表示反斜杠 ),之后在数据库查询前由于使用了GBK多字节编码,%df%5c会gbk编码转换成为汉字"運",从而使得%27,也就是单引号逃逸。
宽字节注入与普通注入payload上的区别就是:在会被转义的字符前加上%df。
http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-32/ http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-33/ http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-34/ http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-35/ http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-36/ http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-36/
防火墙保护与http参数污染
我目前遇到的过的就只有:
http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-29/ http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-30/ http://111.231.88.117/sqli_lab/sqli-labs-php7/Less-31/
防火墙的过滤:
function
这个过滤的意思是,只要不是数字,全给过滤掉,照理说是非常安全的。然而:
function
函数java_implimentation()的逻辑有严重错误: 一旦这个数组里的个数不止1个,并且每个组员都是id开头,那么返回只会返回第一个组员的 比如id=1&id=sql_injection 传入java_implimentation函数会先被打散为:[“id=1”,”id=sql_injection”],返回的是1,成功的通过了whitelist的检查。 但是$id=$_GET['id']取的是最后一个id,所以我们只需要把payload放在后面的id就好。
比如:
?id=1&id= 'union select 1,version(),database() --+
这种绕过方法,就叫做http参数污染。
至此,sqlilabs中的basic injection(除了header injection,没有什么新东西就省略了)和advanced injection就总结完了。之后还有stacked injection和challenges。上面很多东西都写得很浅显,主要是因为我自己也还不太懂,以后再慢慢补充吧。
文章转自我的个人博客: http://procodeus.github.io