常见寻找 SQL 注入方法总结

简介: 常见寻找 SQL 注入方法总结

一、借助推理进行测试

识别 SOL 注入有一种简单的规则:通过发送意外数据来触发异常。该规则包括如下含义:

1. 识别 Web 应用上所有的数据输入。

2. 了解哪种类型的请求会触发异常。

3. 检测服务器响应中的异常。

二、通过参数判断

假设你正在访问一个网站,其 URL 如下

http://sqli-labs:8989/Less-1/?id=1

http://sqli-labs:8989/Less-1/?id=2


这个页面收到一个名为 id 的参数,该页面似乎是将 id 参数作为查询条件,并根据后台数据库的查询结果来显示 。

现在开始手动修改参数值,将其改为网站未预料的值。如:'

http://sqli-labs:8989/Less-1/?id=1'

这个报错是由于SQL语法错误导致的。错误信息中指出了错误发生在语句的末尾,接近 '1' LIMIT 0,1 这部分。


至此可以判断该页面存在 SQL 注入


三、永真与永假测试

假如这是一个网站查询的 SQL 语句

SELECT *
FROM products
WHERE category='[attacker's control]'

注入 attacker'很明显会产生错误,因为末尾增加了多余的单引号,这导致该 SQL语句出错,但是可以尝试不同的风格,例如 ’bike‘ or '1'='1

SELECT *
FROM products
WHERE category='bikes' OR '1'='1' /*总是为真,返回所有行 */

在WHERE子句中,使用了一个条件:category='bikes' OR '1'='1'。这个条件的目的是返回所有category为'bikes'的记录,同时也使用了OR逻辑运算符和'1'='1'条件。'1'='1'始终为真,因此这个条件始终成立,导致查询结果返回了所有记录,而不仅仅是category为'bikes'的记录。


注入永真条件有个缺点:查询结果会包含表中的所有记录。如果存在上百万条记录,那么查询执行的时间会很长,而且会耗费数据库和Web服务器的大量资源。该问题的解决办法是:注入一些不会对最终结果产生影响的内容,比如 bikes' or '1'='2。  

SELECT *
FROM products
WHERE category='bikes' OR '1'='2'

1 不等于 2,该条件为假。所以只会返回 bikes 的记录。

对于这种情况,还可以进行另外一种测试:注入一个永假语句。为实现该目的,我们发送个不会产生结果的值。比如 bikes 'AND '1'= '2

SELECT *
FROM products
WHERE category='bikes' AND '1'='2'

上述语句不会返回任何结果,因为条件有一个不成立。如果还是返回了结果,应该是使用了 UNION 关键字,咱们只修改了其中一个部分

四、SQL 盲注

Victim 公司允许用户通过页面上的身份验证表单登录到 Web 站点。身份验证表单要求用户输入用户名和口令。如果任意地输入用户名和口令,那么结果页面会显示“Invalid username or password”消息。这是可以预料到的结果。但如果输入 user' or '1'=1'作为用户名,就会显示如图所示错误

进一步讲,username 字段很容易


发现这种情况后,可注入一个永假条件并检查返回值的差异,这对进一步核实username字段是否易受SOL注入来说非常有用



做完永假测试后可以确认 username 字段存在 SQL 注入

SQL盲注是一种 SOL可以操纵 SOL语句,应用会针对真假条件返回不同的值。但是无法检索查询结果。

由于 SQL 盲注非常耗时且需要向 Web 服务发送很多请求,因而要想利用该,就需要采用自动的技术。


相关文章
|
3天前
|
SQL Web App开发 安全
【less-1】基于SQLI的SQL字符型报错注入
【less-1】基于SQLI的SQL字符型报错注入
13 2
|
3天前
|
SQL 安全 PHP
基于PHPCMS的SQL注入(Havij)
基于PHPCMS的SQL注入(Havij)
11 1
|
16天前
|
SQL 关系型数据库 MySQL
怎么通过第三方库实现标准库`database/sql`的驱动注入?
在Go语言中,数据库驱动通过注入`database/sql`标准库实现,允许统一接口操作不同数据库。本文聚焦于`github.com/go-sql-driver/mysql`如何实现MySQL驱动。`database/sql`提供通用接口和驱动注册机制,全局变量管理驱动注册,`Register`函数负责添加驱动,而MySQL驱动在`init`函数中注册自身。通过这个机制,开发者能以一致的方式处理多种数据库。
|
22天前
|
SQL 安全 关系型数据库
SQL 注入神器:SQLMap 简单使用
SQL 注入神器:SQLMap 简单使用
|
3天前
【干货】sql-labs、请求方式、注入类型、拼接方式
【干货】sql-labs、请求方式、注入类型、拼接方式
6 0
|
30天前
|
SQL 存储 Java
如何避免SQL注入攻击?
如何避免SQL注入攻击?
|
1月前
|
SQL 关系型数据库 MySQL
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法​ 窗口函数
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法​ 窗口函数
|
1天前
|
SQL 监控 安全
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
|
5天前
|
SQL 关系型数据库 MySQL
SQL优化方法有哪些?
【6月更文挑战第16天】SQL优化方法有哪些?
205 5
|
3天前
|
SQL Web App开发 前端开发
【less-11】基于SQLI的POST字符型SQL注入
【less-11】基于SQLI的POST字符型SQL注入
15 2