最近科三考试临近,疲惫的练车时光就要结束了,彩六也是打到手软才突然想起要学习,决定挤出了点时间研究下sql inject,在这里做下记录和小结。
什么是注入? 注入(inject)攻击产生的本质原因是输入过滤机制的不完善,导致攻击者可以利用输入数据构造执行代码,从而造成信息泄露、数据损坏、服务宕机等一系列问题。由于注入(inject)攻击常常导致严重后果,进一步催生了`一切输入有害 的重要安全思想。
注入如何产生? 个人认为注入攻击产生的本质是:当一段输入数据需要添加到另一端执行指令或代码中时,攻击者可以根据指令或代码的语法刻意构造一段输入数据,造成的输入数据作为指令执行的错误。
例如在PHP + MySQL平台下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 <?php $name = $_POST ['name' ]; $con = mysqli_connect ("127.0.0.1" ,"root" ,"" ,"test" ) or die ("error" );$query = "SELECT * FROM person WHERE name='$name ';" ;$result = mysqli_query ($con ,$query );while ($row =mysqli_fetch_assoc ($result )) echo $row ['age' ]; ``` 这是一个用户通过输入name从person表查询对应age的场景,但是代码中没有对输入变量$name 进行任何检测和过滤,如果我们构造$name 为`1 'or' 1 '=' 1 `,那么查询语句$query 就会变成:`"SELECT * FROM person WHERE name='1' or '1'='1';" `,然而该查询语句恒成立,意味着这样的输入将会爆出数据库person表中所有人的age,造成信息泄露。 在上面这个案例中,如果我们对$name 或者$query 进行过滤,比如将`'`和`"`转义,或者字符处理掉`=`,那么上面构造的输入数据不会被执行。这只是一个最简单的案例,想了解和实践更多可以部署[DVWA](http://www.dvwa.co.uk/)进行本地或者远程测试。 ## SQL注入 根据是否有直接反馈信息分为 普通注入 和 盲注,盲注往往要利用`sleep()`时间盲注或者利用`ascii()`进行布尔盲注。 大概流程是这样的: 1.注入POC 2.猜字段数 3.猜字段顺序 4.爆数据库名 5.爆表名 6.爆字段 7.脱裤 有些步骤根据实际情况可有可无的,爆库过程中需要用到`information_schema`,在这里我就不XJB说了,具体参考: [DVWA-1.9全级别教程之SQL Injection](http://www.freebuf.com/articles/web/120747.html) [DVWA-1.9全级别教程之SQL Injection(Blind)](http://www.freebuf.com/articles/web/120985.html) ## SQL注入绕过 我参考文章做了一些本地测试,记录了一些可能常用的绕过方法,环境为lamp,以下就算是是笔记了,一开简单记录,后面有时间会细化。 1. 空格:`/**/` `%a0` `()` 2. `' `引号:`hex ()` `urlencode ()`3 . `=`等号:`like` `rlike` `regexp`4 . `<>`比较符:`greatest ()` `least ()` `strcmp ()` `in` `between`5 . `,`逗号:`substr ()`和`mid ()`用`from to`代替,`limit`用`offset`6 . 其他绕过: 大小写、字符嵌套、内联注释等还有一个没看懂的先mark:[一些报错注入](https: **宽字节注入**: 这个注入方式比较特殊,有两个产生条件。 - 涉及到gbk编码 (iconv等含有编码转化功能的函数) - 涉及到转义`\`(魔术引号、addslashes、htmlspecialchars) 原理大概是,正常字符为2 字节,汉字字符为4 字节,在gbk的编码环境下可以`%df\`这样的字符,应为`\`的编码是`%5 c`,结合起来为`%df%5 c`,解码结果为汉字`運`,从而绕过了`\`的转义消毒。 **注:gbk2312应不存在低位范围无法进行宽字节注入,具体参考[这里](http: 后续会慢慢添加实例帮助理解和实践。 参考: [SQL注入绕过技巧](https: [sql关键词绕过【积累中】](https: 无论是XSS、sqli还是commandi,只要有输入数据添加到指令的场景,就有注入攻击发生的风险,开发者也在努力寻找通用性解决方案。 PHP和python中不正确的使用`system ()` `exec ()`等函数会导致命令注入,前段不对js代码进行过滤会导致XSS,windows平台还有dll注入(不明觉厉),感觉都很刺激啊。 PHP5.4 后使用的PDO技术和Mysqli几乎已经杜绝了sql注入,其他平台的防御策略也越来越完善,所以sql在实际渗透环境中可能作用并不大,但是这种思想还是很有意思的。  吐槽几句,贵阳这天气是魔鬼吗,阳光直射出门半小时后大暴雨,学车能遇到军事行动,四妹又在发情期,真是每天都有新乐趣hhhh