预热挖掘SQL注入

挖掘SQL注入经验分享+基础原理

SQL注入常常出现在于数据库进行交互的地方

http请求中的user-agent,client-ip,x-forward-for等可能会被程序存储到数据库中的地方。另外,在订单处理的地方,由于业务逻辑复杂,经常会有二次注入漏洞。

 GET /test.php HTTP/1.1
 Host: 127.0.0.1
 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0//告诉服务器把客户端的信息
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
 Accept-Encoding: gzip, deflate
 DNT: 1
 X-Forwarded-For: 8.8.8.8//XXF头,用于显示客户端的IP地址可以有多个,用逗号隔开。
 Connection: keep-alive
 Upgrade-Insecure-Requests: 1
 Cache-Control: max-age=0

• User-Agent:使得服务器能够识别客户使用的操作系统,游览器版本等.(很多数据量大的网站中会 记录客户使用的操作系统或浏览器版本等存入数据库中)

• Cookie:网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)

• X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,(通常一些网站的防 注入功能会记录请求端真实IP地址并写入数据库or某文件[通过修改XXF头可以实现伪造IP])

• Clien-IP:本机IP

• Rerferer:浏览器向 WEB 服务器表明自己是从哪个页面链接过来的

• Host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号

普通注入

普通注入指直接可以用工具进行注入的漏洞,相对简单,手工union联合查询就直接查询的漏洞,如下所示

我们常见的漏洞方式有两种,一种是int一种是string(整型与字符串型),在string中注入需要使用单双引号进行闭合下面演示下

打开Navicat建立一个数据库admin,建立use表,

输入命令

 mysql> INSERT INTO user(id,username,password,email)VALUES(3,"admin1","123546","13@163.com");
 Query OK, 1 row affected
 mysql> INSERT INTO user(id,username,password,email)VALUES(4,"admin3","123546","1123@163.com");
 Query OK, 1 row affected
 mysql> INSERT INTO user(id,username,password,email)VALUES(2,"admin","123546","12113@163.com");
 Query OK, 1 row affected

增删改查常见的语句

增加数据;insert into库(列1,列2.....)values(值1,值2...)

 INSERT INTO user(id,username,password,email)VALUES(3,"admin1","123546","13@163.com");

插入admin里的user(id,username,password,email)

values()指与上方对应的数据运行语句

 INSERT INTO admin.user(id,username,password,email)VALUES(4,"admin4","123546","13ghsd@163.com");

我们已经添加成功了

查询语句select*from admin.user where id

这条语句是我们最常见的,往往的注入也是又这里产生,当最简单的整型注入在后面加入单引号看返回值,返回错误,以及and 1=1,and 1=2的逻辑判断。

数字型注入测试步骤与背后的查询

假设URL为http://www.shentouyun.com/test.php?id=87

http://www.shentouyun.com/test.php?id=87‘

其背后的语句为select*from table where id=87'

这样的语句往往会出错,导致页面不能正常进行显示

http://www.shentouyun.com/test.php?id=87 and1=1

select*from table where id=87and1=1

页面正常,返回数据与正常数据相同

http://www.shentouyun.com/test.php?id=87and1=2

这回的SQL语句编程

select*from table where id=87'and1=2,

虽然语句正常,但是无法查询数据,因为and 1=2始终为假,其返回页面与原始请求有差异,

字符型注入与其大同小异

当输入是字符串时,其注入需要单引号闭合,字符型注入最关键的是怎么去闭合SQL语句以及去注释多余的代码,当查询内容为字符串时,SQL语句如下

select*from table where username=’admin‘

当字符型注入 and1=1为什么不能去正常查询,看如下语句

select * from table where username='admin and 1=1'

因为admin and1=1 会被数据库当做查询的字符串如果想要注入就要考虑字符串的闭合问题,

select * from table where username='admin 'and 1=1--'

测试源码

 <?php
 $servername = "localhost";
 $dbusername = "root";
 $dbpassword = "root";
 $dbname = "admin";
 $id=$_GET['id'];//id未经过滤
 $conn=mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");
 mysql_select_db($dbname,$conn);
 mysql_query('set names utf8');
 $sql = "SELECT * FROM article WHERE articleid='$id'";
 echo $sql."<br>";
 $result = mysql_query($sql,$conn);
 $row = mysql_fetch_array($result);
 echo "<p>利用SQL注入漏洞拖库<p>";
 if (!$row){
 echo "该记录不存在";
 exit;
 }
 echo "标题<br>".$row['title']."<p>";
 echo "内容<br>".$row['content']."<p>";
 ?>

在审计里我的做法是

查找输入点,跟随输入信息,是否可利用,构造注入语句,验证漏洞,

原文发布于微信公众号 - 渗透云笔记(shentouyun)

原文发表时间:2019-07-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券