提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本文为作者的学习笔记。其中详细记载了作者对于SQL 数字型注入的理解,同时也介绍了利用union联合查询注入成功的完整过程。本文最后作者利用iwebsec和Webgoat两个平台来进行实战。如果有不足之处,欢迎指正。
提示:以下是本篇文章正文内容,下面案例可供参考
一、SQL 数字型注入原理
当输入的参数为整型时例如:ID、年龄等。如果此时存在注入漏洞,则可以认为是数字型注入漏洞。可以说数字型漏洞是最简单的一个。 它的判断步骤如下: 第一步:在参数后面加上**“ ‘ ”** (单引号),之后发现页面发生错误 (这一步的作用是判断是否存在注入漏洞,如果不报错那就证明此处没有注入漏洞。只有在服务器将这个单引号一起当作SQL语句时才会报错此处也就存在了SQL注入漏洞) 
第二步:在参数后面加上**“ and 1=1 ”** ,之后发现页面返回正常 
第三步:在参数后面加上 and 1=2 ,之后发现页面返回错误,证明此处有SQL数字型注入漏洞 
二、完整注入过程
第一步判断注入点在判断是否为数字型注入时已经完成。 第二步判断列数使用 order by 来猜列数是多少。order by 3 是以第三列为标准进行升序排序,如果后面的数字大于实际的列数就会报错,我们就是利用这个特点猜解列数,可以用二分法。  
第三步是判断显错点 我们已经知道列数是三,那么在后面输入 and 1=2 union select 1,2,3  union联合查询是将两个查询结果合并起来,然后一起输出。但是由于一般都输出第一行,那么按理说输出结果应该和之前的结果是一样的,为什么不一样呢。是因为我们在前面添加了 and 1=2 将之前的查询语句调整为false,所以自然而然输出的结果就只有1,2,3了。 第四步是获取数据库名称 我们一直在Mysql5以后都会存在一个元数据库称为 information_schema ,这里面记录了Mysql数据库里面的所有信息,例如数据库的名称以及表的名称和列的名称。  当然我们也可以利用数据库自带的函数来获取我们所需要的部分信息。例如:
user() //用户名
@@datadir //数据库路径
version() //数据库版本
@@compile_version_os //操作系统版本
 我们得出数据库的名称为iwebsec 第五步是获取表名和列名 我们利用information_schema这个数据库来查询我们想知道的信息  查出表名之后我们继续查询列名 
最后一步获取数据 
三、总结
1.
数字型注入是SQL注入中最简单的漏洞,它的主要问题就在于利用union联合查询并且将前面正常的查询沉默。information_schema数据库里面的内容要记住。
2.
数字型注入与字符型注入的区别不大,只不过字符型注入需要闭合单引号。只要将单引号闭合之后它就变得与数字型注入一样了。在判断是否为数字型注入时第二步和第三步就可以主要是区别字符型注入和数字型注入。
<?php
require_once('../header.php');
require_once('db.php');
?>
<html>
<head>
<title>MySQL 数字型 SQLi</title>
</head>
<h2>MySQL 数字型 SQLi</h2>
<div class="alert alert-success">
<p>/01.php?id=1 </p>
</div>
<body>
<?php
if(isset($_GET[id])){
$id=$_GET[id];
echo $id."<br>";
$sql="SELECT * FROM user WHERE id=$id LIMIT 0,1";
echo $sql."<br>";
$result=mysql_query($sql);
}
else{
exit();
}
if ($result) {
?>
<table class='table table-striped'>
<tr><th>id</th><th>name</th><th>age</th></tr>
<?php
while ($row = mysql_fetch_assoc($result)) {
echo "<tr>";
echo "<td>".$row['id']."</td>";
echo "<td>".$row['username']."</td>";
echo "<td>".$row['password']."</td>";
echo "</tr>";
}
echo "</table>";
}
else
{
print_r(mysql_error());
}
?>
总结
希望这篇文章对各位有帮助。本篇文章属于作者的学习笔记,如果有不足之处,可以在评论区讨论。后续如果有新的理解会继续更新。 祝各位学业进步,事业有成
|