通过mysql_query进行SQL注入

问题描述:

我正在使用通过SQL注入攻击的网站(乍一看,只有数据库条目被跨站点脚本破坏)我在查看代码后发现的潜在漏洞是有一个很多mysql_query调用的输入都没有被转义。通过mysql_query进行SQL注入

好老:

$query = "SELECT * FROM mytable where name LIKE '%".$_GET['name']."%'"; /*HACK HERE*/ 
mysql_query($query, $connection); 

不过我找不到我们怎么可以做一些从注入漏洞爽(用酷我的意思是这样的INSERT或UPDATE)。我试图建立一个像这样的陈述:

SELECT * FROM mytable where name LIKE '%' AND WHERE id IN (INSERT INTO secondtable (id,description) VALUES (15, 'Fifteenth description');--%' 

没有成功。我猜INSERT在这里没有任何关系。

我现在在代码中转义所有用户的输入,但我并没有真正了解黑客是如何渗透到这个网站的,然后我并不是100%确定我的修复程序能够完成这项工作。任何精彩的建议?

感谢

+1

我想这个网站是不是正确的地方问如何做到这一点:) – Mike 2012-01-29 14:03:37

+0

请确保'名称'与基本字符串连接形成有效的SQL。 – EBarr 2012-01-29 14:05:20

+0

攻击者可以很容易地'加入'/'联合'另一个表并获得管理员登录凭据。然后,凭借较高的特权,他可以做更多的恶事,例如上传一个PHP shell来执行服务器上的任意命令 – knittl 2012-01-29 14:11:37

$query = "SELECT * FROM mytable where name LIKE '%".$_GET['name']."%'"; 

$_GET['name']="'; DROP TABLE mytable; -- "; 

所以

$query = "SELECT * FROM mytable where name LIKE '%'; DROP TABLE mytable; -- %'"; 
+0

更详细的说明为什么这是错误的? – 2012-01-29 14:06:35

+1

是的,看看下面的评论xbonez'回答 – joni 2012-01-29 14:11:20

+0

mysql_query只需要一个查询,但是谢谢 – AsTeR 2012-01-29 19:28:27

现在,它已经有一段时间没有任何PHP,但一般大多数数据访问库有某种参数化的SQL,以减少风险。快速谷歌想出了这个为PHP: http://php.net/manual/en/pdo.prepared-statements.php

另一张海报已经描述了如何做一个SQL注入,所以我不会进入。

+0

“那么我不是100%肯定我的修复会完成这项工作,任何精彩的建议? - 我建议一个备用修补程序 – Daniel 2012-01-29 14:12:56

+0

这个修复与使用的相同。但是op要求不同的性质。你只是不明白的问题 – 2012-01-29 15:10:42

+0

国际海事组织它是一个家庭滚动解决方案与经过试验和测试的库之间的相当大的差异 – Daniel 2012-01-29 15:19:35

可能的情况1
弱密码/散列会让攻击者选择管理员密码。
更改所有管理员密码是明智之举。

+0

没有办法做一个直接的插入或更新?据我所知, – AsTeR 2012-01-29 19:30:16

+2

- 不。 – 2012-01-29 19:33:14

因为mysql_query不支持多个查询,所以像'; DROP TABLE mytable; --这样做的任何注入都不会成功。

但是,攻击者可以结合其他选择语句来选择其他信息,如密码信息。

我很确定黑客能够轻松修改查询。即使mysql_query()不支持多个查询,也有解决方法。你可以在最后加上一个mysql IF语句,当然这会执行一个全新的查询。

+0

感谢你的努力,问题是“有什么方法”,而不是“有没有办法”。 – 2012-01-29 17:17:10

根据您使用的mysql的版本以及连接的设置,mysql_query可能允许more than one statement

您应该看看如何创建连接,以及如何使用mysql_set_server_option