【问题标题】:PHP with SQL Injection带有 SQL 注入的 PHP
【发布时间】:2011-01-16 02:47:59
【问题描述】:

好的,重新开始>

对于我们在系统安全课程中的第一个作业,我们必须侵入教授们“组织得很便宜”的 sql 数据库。我知道唯一的用户是“admin”并选择一个随机密码,在 php 中生成的 select 语句是:

select user_id from user where user_username = 'admin' AND user_password = md5('noob')

现在,我开始尝试使用“admin'--”破解蹩脚的登录名

select user_id from user where user_username = 'admin'--' AND user_password = md5('noob')

但是被推送到数据库的实际值是

select user_id from user where user_username = 'admin\'--' AND user_password = md5('noob')

这没有帮助。服务器使用 POST 从表单中获取值。我已经通过禁用 javascript 绕过了发送端的任何值处理。

php 中似乎没有任何东西可以以任何方式修改输入。

【问题讨论】:

标签: php sql code-injection


【解决方案1】:

假设 select 语句是登录表单的一部分,那么它很可能会生成如下内容:

$user = $_POST['username'];
$pwd = $_POST['password'];

$query = "SELECT .... WHERE user_username='$user' AND user_password=md5('$pwd')";

也就是说,你可以通过输入:

noob') or ('a'='a

为密码,给你

SELECT .... AND user_password=md5('noob') or ('a'='a')
                                   ^^^^^^^^^^^^^^^^^-- your contribution

实际密码可能不匹配,但 'a' 将始终等于自身,因此 where 子句将成功并完全根据用户名匹配记录并返回管理员用户的 user_id。

【讨论】:

  • 正如我上面提到的,系统仍在服务器端创建转义序列,据我所知,这似乎是操作系统在做的。评估为 > select user_id from user where user_username = 'admin' AND user_password = md5('nooboraa')
  • Debian 不会这样做。 Apache 可能是。
  • 无论是什么改变了值,我将如何绕过它?
  • 也许这会有所帮助:shiflett.org/blog/2006/jan/…
【解决方案2】:

正如其他人所提到的,您看到的转义不是操作系统,而是在 PHP 中完成的某种形式的编码(可能是魔术引号,但可以直接调用 addlashes())。

基本上,您需要做的是以不会被转义的报价形式发送。您应该研究为什么要使用 mysql_escape_string() 而不是 addlashes() 和/或检查一下:http://forums.hackthissite.org/viewtopic.php?f=37&t=4295&p=30747

【讨论】:

    【解决方案3】:

    尝试' OR 1; -- 作为用户名。想象一下来自这样一个用户名的 SQL 查询是什么样的。

    【讨论】:

      【解决方案4】:

      这与操作系统无关。操作系统只运行 PHP 包。 PHP是什么做消毒等。

      您是否尝试为 user_username 提交以下字符串?:

      admin' OR 1=1-- #assuming mysql
      

      会产生一个查询:

      select user_id from user where user_username = 'admin' OR 1=1 --' AND user_password = md5('noob')
      

      在mysql(假设数据库类型)中,--是注释,所以1=1之后的所有内容都被忽略。结果,您已成功获得访问权限。

      但是,如果启用了 php 魔术引号,这将稍微困难一些。您将需要提交 utf-8 之外的字符或尝试溢出或提交空字节。

      【讨论】:

      • yields the query > select user_id from user where user_username = 'admin\'' OR 1=1 --' AND user_password = md5('noob')
      【解决方案5】:

      您也可以在输入一个字符串后尝试使用谷歌搜索,这会导致管理员出错并使用返回的部分消息作为关键字。

      您也可以使用http://gray.cs.uni.edu/moodle/mod/forum/discuss.php?d=106fourm 提问,让全班同学受益!

      如果您能弄清楚如何上传文件,那就太好了!我想让 c99.php 真正造成一些伤害!

      你也可以尝试一些“散列”诗句“破折号”

      【讨论】:

        猜你喜欢
        • 2014-02-19
        • 2018-06-24
        • 1970-01-01
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        • 1970-01-01
        • 2011-07-05
        • 2018-03-23
        相关资源
        最近更新 更多