通过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%确定我的修复程序能够完成这项工作。任何精彩的建议?
感谢
$query = "SELECT * FROM mytable where name LIKE '%".$_GET['name']."%'";
$_GET['name']="'; DROP TABLE mytable; -- ";
所以
$query = "SELECT * FROM mytable where name LIKE '%'; DROP TABLE mytable; -- %'";
现在,它已经有一段时间没有任何PHP,但一般大多数数据访问库有某种参数化的SQL,以减少风险。快速谷歌想出了这个为PHP: http://php.net/manual/en/pdo.prepared-statements.php
另一张海报已经描述了如何做一个SQL注入,所以我不会进入。
可能的情况1
弱密码/散列会让攻击者选择管理员密码。
更改所有管理员密码是明智之举。
没有办法做一个直接的插入或更新?据我所知, – AsTeR 2012-01-29 19:30:16
- 不。 – 2012-01-29 19:33:14
因为mysql_query
不支持多个查询,所以像'; DROP TABLE mytable; --
这样做的任何注入都不会成功。
但是,攻击者可以结合其他选择语句来选择其他信息,如密码信息。
我很确定黑客能够轻松修改查询。即使mysql_query()不支持多个查询,也有解决方法。你可以在最后加上一个mysql IF语句,当然这会执行一个全新的查询。
感谢你的努力,问题是“有什么方法”,而不是“有没有办法”。 – 2012-01-29 17:17:10
根据您使用的mysql的版本以及连接的设置,mysql_query可能允许more than one statement。
您应该看看如何创建连接,以及如何使用mysql_set_server_option。
我想这个网站是不是正确的地方问如何做到这一点:) – Mike 2012-01-29 14:03:37
请确保'名称'与基本字符串连接形成有效的SQL。 – EBarr 2012-01-29 14:05:20
攻击者可以很容易地'加入'/'联合'另一个表并获得管理员登录凭据。然后,凭借较高的特权,他可以做更多的恶事,例如上传一个PHP shell来执行服务器上的任意命令 – knittl 2012-01-29 14:11:37