|
$offset = $argv[0]; // 注意,没有输入验证! $query = “SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;“; $result = pg_query($conn, $query); ?> 一般的用户会点击 $offset 已被斌值的“上一页”、“下一页”的链接。原本代码只会认为 $offset 是一个数值。然而,如果有人尝试把以下语句先经过 urlencode() 处理,然后加入URL中的话: 0; insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd) select \“crack\“, usesysid, \“t\“,\“t\“,\“crack\“ from pg_shadow where usename=\“postgres\“; -- 那么他就可以创建一个超级用户了。注意那个 0; 只不过是为了提供一个正确的偏移量以便补充完整原来的查询,使它不要出错而已。 注: -- 是 SQL 的注释标记,一般可以使用来它告诉 SQL 解释器忽略后面的语句。 对显示搜索结果的页面下手是一个能得到密码的可行办法。攻击者所要做的只不过是找出哪些提交上去的变量是用于 SQL 语句并且处理不当的。而这类的变量通常都被用于 SELECT 查询中的条件语句,如 WHERE, ORDER BY, LIMIT 和 OFFSET。如果数据库支持 UNION 构造的话,攻击者还可能会把一个完整的 SQL 查询附加到原来的语句上以便从任意数据表中得到密码。因此,对密码字段加密是很重要的。 例子 27-3. 显示文章……以及一些密码(任何数据库系统)
$query = “SELECT id, name, inserted, size FROM products WHERE size = \“$size\“ ORDER BY $order LIMIT $limit, $offset;“; $result = odbc_exec($conn, $query); ?> 可以在原来的查询的基础上添加另一个 SELECT 查询来获得密码: \“union select \“1\“, concat(uname \“-\“ passwd) as name, \“1971-01-01\“, \“0\“ from usertable; -- 假如上述语句(使用 \“ 和 --)被加入到 $query 中的任意一个变量的话,那么就麻烦了。 SQL 中的 UPDATE 也会受到攻击。这种查询也可能像上面的例子那样被插入或附加上另一个完整的请求。但是攻击者更愿意对 SET 子句下手,这样他们就可以更改数据表中的一些数据。这种情况下必须要知道数据库的结构才能修改查询成功进行。可以通过表单上的变量名对字段进行猜测,或者进行暴力破解。对于存放用户名和密码的字段,命名的方法并不多。 例子 27-4. 从重设密码……到获得更多权限(任何数据库系统)
$query = “UPDATE usertable SET pwd=\“$pwd\“ WHERE uid=\“$uid\“;“; ?> 但是恶意的用户会把 \“ or uid like\“璵in%\“; -- 作为变量的值提交给 $uid 来改变 admin 的密码,或者把 $pwd 的值提交为 “hehehe\“, admin=\“yes\“, trusted=100 “(后面有个空格)去获得更多的权限。这样做的话,查询语句实际上就变成了:
// $uid == \“ or uid like\“璵in%\“; -- $query = “UPDATE usertable SET pwd=\“...\“ WHERE uid=\“\“ or uid like \“璵in%\“; --“; // $pwd == “hehehe\“, admin=\“yes\“, trusted=100 “ $query = “UPDATE usertable SET pwd=\“hehehe\“, admin=\“yes\“, trusted=100 WHERE ...;“; ?> 下面这个可怕的例子将会演示如何在某些数据库上执行系统命令。 例子 27-5. 攻击数据库所在主机的操作系统(MSSQL Server)
$query = “SELECT * FROM products WHERE id LIKE \“%$prod%\““; $result = mssql_query($query); ?> 如果攻击提交 a%\“ exec master..xp_cmdshell \“net user test testpass /ADD\“ -- 作为变量 $prod的值,那么 $query 将会变成
(责任编辑:网络) |
|