我有一个PHP系统,可以在windows XP上的虚拟服务器"Wamp“上运行。我正在尝试使用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数据。
我怎么可能做到这一点?
再说一次,我没有试图攻击任何系统,这是我拥有的一个系统,我正在试图检测它的漏洞。
发布于 2012-10-18 02:12:57
仅从SQL注入漏洞的概念证明开始,您就需要首先确定注入发生的上下文。尽管在大多数情况下,注入是在WHERE
子句中进行的,但也有其他可能的位置。
接下来,您将尝试确定所选的列数。因为这是MySQL,所以您可以使用ORDER BY x
并指定要对结果进行排序的列号。所以从2' ORDER BY 1 --
,2' ORDER BY 2 --
开始,直到其中一个失败。
然后,您可以将原始结果集与您使用UNION SELECT
注入的另一个结果集连接起来,如下所示:
' UNION SELECT 1, 2, 3, …, n --
这只是一个简单的测试,应该只显示注入的结果集。这些数字给出了哪些值反映在何处的提示。从这里开始,您可以从其他表、视图或其他数据源中选择任何其他值。对于哪些信息是有价值的,一个好的提示可以给你pentestmonkey’s 。
发布于 2012-10-17 22:13:02
通常的方法是使用UNION合并来自两个不同查询的结果。您可能需要花点时间才能获得正确的列数和字符集,以允许查询通过。
web上有几个很好的cheat sheets,可以作为攻击载体的参考。
您真的应该考虑使用允许您使用参数化查询(如准备好的语句)来查询数据库的库,而不是自己构建(和转义)查询。PDO和mysqli都可用于PHP,并将允许准备好的语句。
发布于 2012-10-17 22:18:30
这在技术上是可行的,但应用程序逻辑可能不会显示不同表的值:
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,这样它才能正常工作。
https://stackoverflow.com/questions/12936208
复制相似问题