sql查询空格表示 |
您所在的位置:网站首页 › 查询为空的sql › sql查询空格表示 |
![]() 这一篇主要总结一下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=00000000 confirmpassword=00000000账户admin的密码就被改为了00000000。 这个漏洞的根本原因是,改密码的代码从数据中取数据时直接把admin'#拼接进了sql语句。 特殊字符转义与宽字节注入常见的转义方式: 1)自定义转义函数,比如: function2)调用函数 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 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |