|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
熟悉HTML/CSS/JS等网页基本元素,完成阶段可自行制作完整的网页,对元素属性达到熟悉程度 </p> 法式员们写代码的时分考究TDD(测试驱动开辟):在完成一个功效前,会先写一个测试用例,然后再编写代码使之运转经由过程。其实当黑客SQL Injection时,一样是一个TDD的进程:他们会先测验考试着让法式报错,然后一点一点的修改参数内容,当法式再次运转胜利之时,注入也就随之胜利了。
防御:
假定你的法式里有相似上面内容的剧本:
$sql = "SELECT id, title, content FROM articles WHERE id = {$_GET['id']}";
正常会见时其URL以下:
/articles.php?id=123
当黑客想判别是不是存在SQL Injection破绽时,最经常使用的体例就是在整形ID前面加个单引号:
/articles.php?id=123'
因为咱们没有过滤$_GET['id']参数,所以必定会报错,能够会是相似上面的信息:
supplied argument is not a valid MySQL result resource in ...
这些信息就足以申明剧本存在破绽了,咱们可以再耍点手腕:
/articles.php?id=0 union select 1,2,3
之所以select 1,2,3是由于union请求双方的字段数分歧,后面是id,title,content三个字段,前面1,2,3也是三个,所以不会报语法毛病,还有设置id=0是一条不存在的纪录,那末查询的了局就是1,2,3,反应到网页上,本来显示id的中央会显示1,显示title的中央会显示2,显示content的中央会显示3。
至于若何持续使用,还要看magic_quotes_gpc的设置:
当magic_quotes_gpc为off时:
/articles.php?id=0 union select 1,2,load_file('/etc/passwd')
如斯一来,/etc/passwd文件的内容就会显示在本来显示content的中央。
当magic_quotes_gpc为on时:
此时假如直接利用load_file('/etc/passwd')就有效了,由于单引号被本义了,然而还有举措:
/articles.php?id=0 union select 1,2,load_file(char(47,101,116,99,47,112,97,115,115,119,100))
个中的数字就是/etc/passwd字符串的ASCII:字符串每一个字符轮回输入ord(...)
除此觉得,还可使用字符串的十六进制:字符串每一个字符轮回输入dechex(ord(...))
/articles.php?id=0 union select 1,2,load_file(0x2f6574632f706173737764)
这里仅仅说了数字型参数的几种进击手腕,属于冰山一角,字符串型参数等进击手腕看前面的文档链接。
戍守:
收集上有一些相似SQL Injection Firewall的软件可供利用,好比说GreenSQL,假如网站已入手下手蒙受SQL Injection进击,那末利用如许的快捷东西常常会救你一命,不外如许的软件在架构上属于一个Proxy的脚色,多半会影响网站并发功能,所以在选择与否这个成绩上最好视客不雅前提来稳重决意。良多时分专业的软件并非必需的,还有良多轻量级处理计划,上面演示一下若何利用awk来检测能够的破绽。
创立detect_sql_injection.awk剧本,内容以下(假如要拷贝一下内容的话记得不要包含行号):
01 #!/bin/gawk -f
02
03 /\$_(GETPOSTCOOKIEREQUEST)\s*\[/ {
04 IGNORECASE = 1
05 if (match($0, /\$.*(sqlquery)/)) {
06 IGNORECASE = 0
07 output()
08 next
09 }
10 }
11
12 function output()
13 {
14 $1 = $1
15 print "CRUD: " $0 "\nFILE: " FILENAME "\nLINE: " FNR "\n"
16 }
此剧本可婚配出相似以下的成绩代码,想要扩大婚配形式也轻易,只需照猫画虎写if match语句便可。
1:$sql = "SELECT * FROM users WHERE username = '{$_POST['username']}'";
2:$res = mysql_query("SELECT * FROM users WHERE username = '{$_POST['username']}'");
利用前别忘了先chmod +x detect_sql_injection.awk,有两种挪用办法:
1:./detect_sql_injection.awk /path/to/php/script/file
2: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: 123
实际情况中有良多使用这个剧本的办法,好比说经由过程CRON按期扫描法式源文件,或在SVN提交时经由过程钩子办法主动婚配。
利用专业东西也好,检测剧本亦罢,都是主动的戍守,成绩的基本一直取决于在法式员思想里是不是有需要的平安认识,上面是一些必需要切记的原则:
1:数字型参数利用相似intval,floatval如许的办法强迫过滤。
2:字符串型参数利用相似mysql_real_escape_string如许的办法强迫过滤,而不是复杂的addslashes。
3:最好丢弃mysql_query如许的拼接SQL查询体例,尽量利用PDO的prepare绑定体例。
4:利用rewrite手艺埋没真实剧本及参数的信息,经由过程rewrite正则也能过滤可疑的参数。
5:封闭毛病提醒,不给进击者供应敏感信息:display_errors=off。
6:以日记的体例纪录毛病信息:log_errors=on和error_log=filename,按期排查,Web日记最好也查。
7:不要器具有FILE权限的账号(好比root)毗连MySQL,如许就屏障了load_file等风险函数。
8:......
网站平安其实其实不庞杂,总结出来就是一句话:过滤输出,本义输入。个中,咱们下面一向会商的SQL Injection成绩就属于过滤输出成绩,至于本义输入成绩,其代表是Cross-site scripting,但它不属于本文的范围,就不多说了。
文档:
addslashes() Versus mysql_real_escape_string()
SQL Injection with MySQL
Advanced SQL Injection with MySQL
MySQL注入中导出字段内容的研讨——经由过程注入导出WebShell
虽说不上很好,但至少一般的数据操作,再在原有的SQL语言的基础上,用得还是可以的。 |
|