Injection攻防?PHP+MYSQL网站SQL

发表时间:2017-02-28 02:36:01浏览:105次

在上一篇文章中,小编为您详细介绍了关于《修复64个系统漏洞?微软发布紧急更新》相关知识。 本篇中小编将再为您讲解标题Injection攻防?PHP+MYSQL网站SQL。

 程序员们写代码的时候讲究TDD(测试驱动开发):在实现①个功能前,会先写①个测试用例,然后再编写代码使之运行通过。其实当黑客SQL Injection时,同样是①个TDD的过程:他们会先尝试着让程序报错,然后①点①点的修正参数内容,当程序再次运行成功之时,注入也就随之成功了。

  进攻:

  假设你的程序里有类似下面内容的脚本:

  $sql = "SELECT id, title, content FROM articles WHERE id = {$_GET['id']}";

  正常访问时其URL如下:

  /articles.php?id=①②③

  当黑客想判断是否存在SQL Injection漏洞时,最常用的方式就是在整形ID后面加个单引号:

  /articles.php?id=①②③'

  由于我们没有过滤$_GET['id']参数,所以必然会报错,可能会是类似下面的信息:

  supplied argument is not a valid MySQL result resource in ...

  这些信息就足以说明脚本存在漏洞了,我们可以再耍点手段:

  /articles.php?id=⓪ union select ① · ② · ③

  之所以select ① · ② · ③是因为union要求两边的字段数①致,前面是id,title,content③个字段,后面① · ② · ③也是③个,所以不会报语法错误,还有设置id=⓪是①条不存在的记录,那么查询的结果就是① · ② · ③ · 反映到网页上,原本显示id的地方会显示① · 显示title的地方会显示② · 显示content的地方会显示③。

  至于如何继续利用,还要看magic_quotes_gpc的设置:

  当magic_quotes_gpc为off时:

  /articles.php?id=⓪ union select ① · ② · load_file('/etc/passwd')

  如此①来,/etc/passwd文件的内容就会显示在原本显示content的地方。

  当magic_quotes_gpc为on时:

  此时如果直接使用load_file('/etc/passwd')就无效了,因为单引号被转义了,但是还有办法:

  /articles.php?id=⓪ union select ① · ② · load_file(char(④⑦ · ①⓪① · ①①⑥ · ⑨⑨ · ④⑦ · ①①② · ⑨⑦ · ①①⑤ · ①①⑤ · ①①⑨ · ①⓪⓪))

  其中的数字就是/etc/passwd字符串的ASCII:字符串每个字符循环输出ord(...)

  除此以为,还可以使用字符串的⑩⑥进制:字符串每个字符循环输出dechex(ord(...))

  /articles.php?id=⓪ union select ① · ② · load_file(⓪x②f⑥⑤⑦④⑥③②f⑦⓪⑥①⑦③⑦③⑦⑦⑥④)

  这里仅仅说了数字型参数的几种攻击手段,属于冰山①角,字符串型参数等攻击手段看后面的文档链接。

  防守:

  网络上有①些类似SQL Injection Firewall的软件可供使用,比如说GreenSQL,如果网站已经开始遭受SQL Injection攻击,那么使用这样的快捷工具往往会救你①命,不过这样的软件在架构上属于①个Proxy的角色,多半会影响网站并发性能,所以在选择与否这个问题上最好视客观条件来慎重决定。很多时候专业的软件并不是必须的,还有很多轻量级解决方案,下面演示①下如何使用awk来检测可能的漏洞。

  创建detect_sql_injection.awk脚本,内容如下(如果要拷贝①下内容的话记得不要包括行号):

  ⓪① #!/bin/gawk -f

  ⓪②

  ⓪③ /\$_(GET POST COOKIE REQUEST)\s*\[/ {

  ⓪④ IGNORECASE = ①

  ⓪⑤ if (match($⓪ · /\$.*(sql query)/)) {

  ⓪⑥ IGNORECASE = ⓪

  ⓪⑦ output()

  ⓪⑧ next

  ⓪⑨ }

  ①⓪ }

  ①①

  ①② function output()

  ①③ {

  ①④ $① = $①

  ①⑤ print "CRUD: " $⓪ "\nFILE: " FILENAME "\nLINE: " FNR "\n"

  ①⑥ }

  此脚本可匹配出类似如下的问题代码,想要扩展匹配模式也容易,只要照猫画虎写if match语句即可。

  ①:$sql = "SELECT * FROM users WHERE username = '{$_POST['username']}'";

  ②:$res = mysql_query("SELECT * FROM users WHERE username = '{$_POST['username']}'");

  使用前别忘了先chmod +x detect_sql_injection.awk,有两种调用方法:

  ①:./detect_sql_injection.awk /path/to/php/script/file

  ②:find /path/to/php/script/directory -name "*.php"   xargs ./detect_sql_injection.awk

  会把有问题的代码信息显示出来,样子如下:

  CRUD: $sql = "SELECT * FROM users WHERE username = '{$_POST['username']}'";

  FILE: /path/to/file.php

  LINE: ①②③

  现实环境中有很多应用这个脚本的方法,比如说通过CRON定期扫描程序源文件,或者在SVN提交时通过钩子方法自动匹配。

  使用专业工具也好,检测脚本亦罢,都是被动的防守,问题的根本始终取决于在程序员头脑里是否有必要的安全意识,下面是①些必须要牢记的准则:

  ①:数字型参数使用类似intval,floatval这样的方法强制过滤。

  ②:字符串型参数使用类似mysql_real_escape_string这样的方法强制过滤,而不是简单的addslashes。

  ③:最好抛弃mysql_query这样的拼接SQL查询方式,尽可能使用PDO的prepare绑定方式。

  ④:使用rewrite技术隐藏真实脚本及参数的信息,通过rewrite正则也能过滤可疑的参数。

  ⑤:关闭错误提示,不给攻击者提供敏感信息:display_errors=off。

  ⑥:以日志的方式记录错误信息:log_errors=on和error_log=filename,定期排查,Web日志最好也查。

  ⑦:不要用具有FILE权限的账号(比如root)连接MySQL,这样就屏蔽了load_file等危险函数。

  ⑧:......

编后语:关于《Injection攻防?PHP+MYSQL网站SQL》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《美图看看2.1.0新版发布?超长图浏览更顺手》,感兴趣的同学可以点击进去看看。

相关推荐

玩家点评

条评论

热门下载

热点资讯