0

我拥有一个在 Windows XP 上的虚拟服务器“Wamp”上工作的 PHP 系统。我正在尝试使用 SQL 注入技术检测系统中的漏洞。

我已经尝试过诸如“' OR 1=1”之类的基本注入方法,并且发现了几个问题。但是,我被困在以下问题上:

我的系统中有以下代码行:

$sql2="SELECT * FROM $table1 WHERE question_id='$id'";

在这行代码之后,我执行查询并显示如下结果:

$result2=mysql_query($sql2);

while($rows=mysql_fetch_array($result2)){
?>
<table width="400" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<td><table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
<tr>
<td bgcolor="#F8F7F1"><strong>ID</strong></td>
<td bgcolor="#F8F7F1">:</td>
<td bgcolor="#F8F7F1"><?php echo $rows['a_id']; ?></td>
</tr>
<tr>
.......
.......

请注意,变量“$id”的值是从上一页作为_GET[] 参数发送的。

我的问题是,我正在尝试注入参数 id=2?(2 是一个例子)是从前一页发送的。这是一个例子:

http://localhost/PHPforum/view_topic.php?id=2

我正在寻找一种注入变量“$id”的值的方法,以使其显示不同表(table2)而不是table1的数据。我可以显示两个表,但我需要通过该注入显示 table2 数据。

我怎么可能做到这一点?

同样,我不是要攻击任何系统,这是我拥有的系统,我正在尝试检测它的漏洞。

4

4 回答 4

2

仅从 SQL 注入漏洞的概念证明,您将首先确定注入发生的上下文。虽然在大多数情况下,注入在WHERE子句中,但也有其他可能的位置。

接下来,您将尝试确定选择的列数。由于这是 MySQL,您可以使用ORDER BY x并指定您希望对结果进行排序的列的编号。所以从 , 开始2' ORDER BY 1 --2' ORDER BY 2 --直到一个失败。

然后,您可以将原始结果集与您注入的另一个结果集连接起来,UNION SELECT如下所示:

' UNION SELECT 1, 2, 3, …, n --

这只是一个简单的测试,应该只显示注入的结果集。这些数字会提示您哪些值反映在哪里。从这里开始,您可以从其他表、视图或其他数据源中选择任何其他值。关于什么信息值得的一个很好的提示可以给你pentestmonkey 的MySQL SQL Injection Cheat Sheet

于 2012-10-17T18:12:57.150 回答
1

通常的方法是使用 UNION 来组合来自两个不同查询的结果。您可能需要花一点时间来获得正确数量的列和字符集以允许查询通过。

网络上有几个很好的 SQL 注入备忘单,您可以将其用作攻击向量的参考。

您应该真正考虑使用一个库,该库允许您使用参数化查询(例如准备好的语句)来查询数据库,而不是自己构建(和转义)查询。PDO 和 mysqli 都可用于 PHP,并允许准备好的语句。

于 2012-10-17T14:13:01.787 回答
0

SQL 注入漏洞实际上并不难找到,恕我直言。

要遵守的简单规则是:

不要将用户提供的值连接到传递给数据库执行的字符串中。

如果你打破了这条规则,即将用户提供的值连接到一个查询字符串中,你就创建了一个 SQL 注入漏洞。

有两种方法可以解决这个问题:

  1. 使用允许您将参数值绑定到查询字符串的库。这些库在执行查询时使用 API 调用将参数值传递给数据库,而不是将值连接到数据库执行的语句中。

  2. 检查所有代码以查看连接到查询字符串中的值来自何处。

我总是选择方法 1,然后我知道我总是安全的。

您可以继续方法 2,但这就像试图救出一艘有洞的船。水将不断涌入,或者,在您的情况下,您所做的每一次更改都必须检查代码。

于 2012-10-17T14:24:18.970 回答
0

这在技术上可行,但应用程序逻辑可能不会显示不同表的值:

http://localhost/PHPforum/view_topic.php?id=2;select * from table2

如果你知道所有的表名和字段名,你可以这样做:

http://localhost/PHPforum/view_topic.php?id=2;select table2id as table1id, table2value as table1value, .. from table2

您可能必须对分号和空格进行 urlencode 才能正常工作。

于 2012-10-17T14:18:30.053 回答