预热挖掘SQL注入

Posted 渗透云笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了预热挖掘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 跟踪而储存在用户本地终端上的数据(通常经过加密)

• Clien-IP:本机IP

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

普通注入

普通注入指直接可以用工具进行注入的漏洞,相对简单,手工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)

预热挖掘SQL注入

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>";
 ?>

在审计里我的做法是

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

本文预热下,技术点不高,在之前的文章中也有讲过,关于SQL注入的文章还有很多要写,包括代码审计,都是要往下推得,实话如果要那种技术含量特别深的,我可能会两天一更或者三天一更来更好的去架构正篇文章从使用的代码,原理,利用,工具来写,时间充分我还会更好的去思考整篇文章。

另外在此文中鼓励两位小伙伴

清茶以及Tone感谢两位大佬在渗透云笔记的官方群里长期活跃,也希望两位大佬的技术更上一层,希望渗透云能够和你们一起进步



清茶以及Tone感谢两位大佬在渗透云笔记的官方群里长期活跃,也希望两位大佬的技术更上一层,希望渗透云能够和你们一起进步



以上是关于预热挖掘SQL注入的主要内容,如果未能解决你的问题,请参考以下文章

以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?

PHP代码审计 那些年我们一起挖掘SQL注入 - 4.全局防护Bypass之二次注入

PHP代码审计 那些年我们一起挖掘SQL注入 - 3.全局防护Bypass之Base64Decode

安全测试 web安全测试 常规安全漏洞 可能存在SQL和JS注入漏洞场景分析。为什么自己没有找到漏洞,哪么可能存在漏洞场景是?SQL注入漏洞修复 JS注入漏洞修复 漏洞存在场景分析和修复示例(代码片段

那些年我们一起挖掘SQL注入 - 6.全局防护Bypass之一些函数的错误使用

安全牛学习笔记手动漏洞挖掘-SQL注入