如何测试我的 PHP MySQL 注入示例?

Posted

技术标签:

【中文标题】如何测试我的 PHP MySQL 注入示例?【英文标题】:How can I test my PHP MySQL injection example? 【发布时间】:2013-03-23 09:32:31 【问题描述】:

我想使用php/mysql注入和登录示例,我的代码如下。

我尝试使用anything' -- 的用户名和一个空密码,但它不起作用,我无法登录。

谁能帮帮我?

<?php
mysql_connect('localhost','root','root');
mysql_select_db('hp');
?>

<form action="" method="post">
<table >
    <tr>
        <td>User</td>
        <td><input type="text" name="user"></td>
    </tr>
    <tr>
        <td></td>
        <td><input type="text" name="password"></td>
    </tr>
</table>
    <input type="submit" value="OK" name="s">
</form>

<?php
if($_POST['s'])
    $user = $_POST['user'];
    $pass = $_POST['password'];     
    $re = mysql_query("select * from zend_adminlist where user_name = '$user' and password = '$pass'");

    if(mysql_num_rows($re) == 0)       
        echo '0';
    else
        echo '1';
    

?>

【问题讨论】:

【参考方案1】:

最常见的例子之一是这个查询:

' or '1'='1

如果您将其作为用户名和密码输入到一些未经处理的登录输入中,则查询会更改如下:

Original: SELECT * FROM USERS WHERE USER='' AND PASS='';
Modified: SELECT * FROM USERS WHERE USER='' or '1'='1' AND PASS='' or '1'='1';

这会导致它寻找的每件事都是真实的,因为 1 总是等于 1。这种方法的问题是它不允许选择特定的用户。这样做您需要通过注释掉它来忽略 AND 语句,如其他示例中所示。

【讨论】:

我主要在查询之后尝试# 1' OR 1=1# 所以之后的代码被注释掉了。有人也可以使用 --【参考方案2】:

如果用户名的值为:

 $_POST['user'] = "1' OR 1 LIMIT 1; --";

那么mysql查询就变成了:

select * 
from zend_adminlist 
where user_name = '1' OR 1 LIMIT 1; --' and password = '$pass'

【讨论】:

不是mysql每个查询只允许1行吗? 1 行,是的,但是一行表示一个查询分隔符:; -- 表示它后面的代码被注释掉了。所以实际上上面的查询是一个查询。我只是换行以使代码可读。 我大部分时间都用#而不是--。

以上是关于如何测试我的 PHP MySQL 注入示例?的主要内容,如果未能解决你的问题,请参考以下文章

如何使我的测试网站易受 SQL 注入攻击?

PHP、PDO、MySQL - 多个 INSERT 容易被注入? [复制]

htmlspecialchars 和 mysql_real_escape_string 是不是可以防止我的 PHP 代码被注入?

如何防止 JSP 中的 SQL 注入?

SQL注入测试环境Apache+PHP+MySQL搭建

这种 SQL 构造是不是容易发生 SQL 注入? [关闭]