内容目录:
-1.问题的范围
-2.SQL攻击的详细解释
-3.解决办法
-4.结论
-5.本文涉及的perl程序
------------------------------------------------------------------------
----[ 1. 问题的范围
许多应用程序都可以通过SQL来进行攻击。现在许多程序知道了避免使用strcpy(),
并且不把用户数据传递给system()调用,但是很多程序还不知道SQL查询可以被黑客
篡改来达到攻击的目的。
写一篇技术文章要比写个安全建议麻烦得多,但是技术文章能够全面地解释我是
如何利用wwwthreads程序的漏洞得到PacketStorm论坛管理员权限和将近800个用户密
码的。
----[ 2. SQL攻击的详细解释
某日,我正在PacketStorm的论坛上浏览,发现这个论坛使用的是wwwthreads。
我突然注意到了URL的参数(URL中’?’后面的部分)。作为一个web安全爱好者,我
对它感到极为好奇。使用试验的攻击方法,我把showpost.pl程序中的’Board=general’
参数改为了’Board=rfp’。提交并发现传回来以下错误信息:
We cannot complete your request. The reason reported was:
Can’t execute query:
SELECT B_Main,B_Last_Post
FROM rfp
WHERE B_Number=1
. Reason: Table ’WWWThreads.rfp’ doesn’t exist
可以发现这儿还有一个参数’Number=1’,我们可以推断出查询请求是这样构造的:
SELECT B_Main,B_Last_Post FROM $Board WHERE B_Number=$Number
如果你读过我在phrack 54上发表过的文章的话(可以到
http://www.wiretrip.net/rfp/p/doc.asp?id=7&iface=2阅读),你就应该明白我要
做什么了。我们不仅可以修改$Board和$Number参数,而且还可以提交额外的SQL命令。
试想一下,如果我们提交的$Board参数是下面的样子:
’general; DROP TABLE general; SELECT * FROM general ’
那么在服务器端就会转化成:
SELECT B_Main,B_Last_Post FROM general; DROP TABLE general;
SELECT * FROM general WHERE B_Number=$Number
’;’符号是SQL命令的结束符。通常我们可以使用’#’来使MySQL忽略此行上的其它
内容。但是,’FROM’和’WHERE’是在一个分开的行上,所以MySQL不会忽略它。考虑到
错误的SQL语句会使MySQL忽略运行后面的语句,所以我们至少要提交一个有效的命令。
在本例中,我们提交一个和原始命令相似的generic select命令,理论上的结果应该
是删除general论坛所在的表。
