首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
WEB安全
发新帖
3
5
[原创]浅谈SQL注入手工测试思路
发表于: 2025-12-11 11:47
3889
[原创]浅谈SQL注入手工测试思路
三六零SRC
2025-12-11 11:47
3889
> 作者:The0dy@360SRC ## 一、 前言 SQL 注入(SQL Injection)作为一种历史悠久却依然高发的漏洞,始终是 Web 应用面临的核心威胁之一。尽管现代 Web 开发框架已内置诸多安全防护机制,自动化扫描工具也能高效排查部分常见注入点,但复杂的业务逻辑、自定义的查询语句以及多样化的过滤规则,仍可能让自动化工具 “失察”。此时,手工测试凭借其灵活性、针对性强的优势,成为挖掘深层 SQL 注入漏洞、验证漏洞可利用性的关键手段。 ## 二、 测试思路 常规检测中,在参数中插入单引号、双引号或括号等特殊字符,若无任何变化 → 通常表明当前参数不存在SQL注入漏洞(输入被安全处理或无法触发异常);出现异常报错(如数据库错误信息) → 可能存在未过滤的注入点,需进一步验证漏洞;返回拦截页面(如WAF提示) → 说明存在防御机制但可被绕过,需尝试特殊绕过手法(如注释符替换、编码变形等)。 ### (一) 单引号闭合注入类 根据测试与分析报告,单引号闭合的 SQL 注入成为最常见且占比最高的注入类型,主要由以下两个核心原因驱动: 1. **数据库设计规范**:多数数据库系统(如 MySQL、PostgreSQL、SQL Server)默认将**单引号作为字符串常量的标准界定符**。例如,SQL 语句中字符串值必须被单引号包裹(如 `WHERE username='input'`),若输入未过滤的单引号,会破坏语句结构并可能引发注入漏洞。 1. **开发实践习惯**: 在 PHP、Python 等后端语言中,开发者常通过**字符串拼接**构造 SQL 查询(如 `"SELECT * FROM users WHERE name='" + user_input + "'"`)。若 `user_input` 含恶意单引号(如 `admin' OR 1=1-- `),将闭合原语句并附加恶意代码,导致注入成功。  例如以下单引号闭合注入案例: 在接口的startTime和endTime参数中输入单引号存在报错。  输入两个单引号,返回正常,这种情况存在sql注入概率就比较大了。  通过嵌套子查询,like 等方式绕过限制,构造出payload:  在 SQL 注入测试中,优先检测单引号闭合是提高效率的关键,但同时也需覆盖双引号、数字型、括号等其他闭合方式,确保测试的全面性。 ### (二) order by 参数注入 在 SQL 中,ORDER BY 后面跟着的用户输入参数无法直接通过预编译处理,导致直接拼接用户输入到 ORDER BY 子句,会引发严重的 SQL 注入风险。例如: #### 1. 注入恶意排序逻辑 用户输入:id; SELECT database()-- 拼接后的 SQL:SELECT * FROM users ORDER BY id; SELECT database()— #### 2. 注入子查询进行盲注 用户输入:id DESC, (SELECT database()) 拼接后的 SQL:SELECT * FROM users ORDER BY id DESC, (SELECT database()) 涉及 SQL 注入风险的排序参数(如 sort、orderby、orderid 等),可通过在参数值后追加 ,0 和 ,1 的方式测试响应差异,以初步判断是否存在 ORDER BY 注入漏洞。如下:  例如,在orderType参数输入,0报错  输入,1正常返回  在mysql数据库中,当order by索引为0,不存在时就会报错,根据这个思路在相关功能处可进行尝试。由于 ORDER BY 子句无法预编译,常通过注入 CASE WHEN 表达式来实现 布尔盲注 或 结果控制。  ## 三、 常用的函数 ### (一) 注用户函数 如user()、current_user、system_user()、session_user(),有的数据库则为user。 ### (二) 逻辑判断函数 下面是最原始的函数用法,后续可以根据实际情况去改变返回的东西 1、case when 1=1 then 1 else 2 end -->如果1=1则返回1,否则返回2。 2、if(1=1,1,1) -->1=1返回1,否则返回2。 3、IFNULL(1,500) -->前面不为null就返回1,为null返回500。 4、NULLIF(5,10) -->如果相等返回为null,否则返回5。 5、decode(1,1,1,2) -->orcale还可以使用decode函数,前面两个1相等则返回1,否则返回2。 其他更多函数使用方法可以自己去看官方文档。 例如NULLIF,当两个相等时返回false:  不等时返回true  ### (三) 截取函数 存在length(user()),len(user),substr(str,pos,len),substring(),mid(),right(str,length),ascii(str),ord(str),lpad(str1,len,str2),rpad(str1,len,str2),instr (root,r),position('r' in 'root'),ltrim()和rtrim(),insert(str,len,x,new),strcmp (str1,str2)等。 关于trim这个函数用的比较少,这里简单说下思路。 trim(leading 'b' from 'abcd'):移除abcd句首的b,但是abcd并不以b为句首开头,所以会返回abcd。 trim(leading 'a' from 'abcd') :则会返回bcd。 那我们的注入语句为:id=1'and trim(leading 'b' from user())=trim(leading 'c' from user()) or 'a'='b,因为user第一位不是b也不是c,所以返回的字符串是一样的,返回为true,假如第一位是b那他就会返回false了。  ## 四、 总结 现在的SQL注入是需要大量的探测和fuzz才会暴露出来。自动化工具虽能覆盖基础场景,但面对自定义过滤规则、业务逻辑耦合的复杂注入点,往往难以突破。手工测试需结合参数特性 —— 如时间型参数的盲注延时、排序参数的语法变形、字符串参数的编码绕过,通过多轮.payload 构造与结果比对,才能挖掘出深层漏洞。
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。
#SQL注入
#漏洞
#审计
收藏
・
3
点赞
・
5
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
mb_kgwhineo
非常支持你的观点!
2026-8-10 07:51
wx_晨梦
为你点赞!
2026-7-16 08:09
good boy
期待更多优质内容的分享,论坛有你更精彩!
2026-3-31 13:51
mb_dpuumgqj
感谢你分享这么好的资源!
2026-3-12 15:09
kotorisaigao
谢谢你的细致分析,受益匪浅!
2025-12-17 11:17
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
3
)
是依蚊呀
雪 币:
134
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
7
粉丝
0
关注
私信
是依蚊呀
2
楼
感谢~
2026-2-28 00:29
0
git_19959suofuren-debug
雪 币:
7
能力值:
( LV1,RANK:0 )
在线值:
发帖
1
回帖
8
粉丝
0
关注
私信
git_19959suofuren-debug
3
楼
你能注入嘛
2026-3-6 15:33
0
qiluword
雪 币:
254
活跃值:
(654)
能力值:
( LV2,RANK:10 )
在线值:
发帖
52
回帖
227
粉丝
1
关注
私信
qiluword
4
楼
感谢,写的很全面
2026-4-1 21:16
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
三六零SRC
42
发帖
39
回帖
30
RANK
关注
私信
他的文章
[原创]iOS安全开发中的Frida检测
3535
[讨论]利润仅$200?Anthropic 最新研究揭示 AI 自动挖掘 0-day 的真实经济账
2572
[原创]浅谈SQL注入手工测试思路
3889
VMP的手动分析和AI还原
4927
[原创]Python代码保护之重置操作码映射的攻与防探究(一)
2032
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部