文章总结: 该文档系统梳理了SQL注入攻击的核心原理、分类与利用技术,涵盖联合查询、布尔盲注、时间盲注、报错注入等主流手法,详细解析了相关函数及绕过过滤技巧。同时提供了基于文件后缀的数据库类型判断方法,并从输入验证、参数化查询、权限最小化等维度给出防御方案。文档还收录了护网行动高频面试题,具有实战指导价值。 综合评分: 85 文章分类: WEB安全,渗透测试,漏洞分析,安全培训,应急响应
2026年护网行动HVV高频面试题-SQL注入
原创
yu9ing yu9ing
跃鹰sec
2026年4月8日 09:47 江苏
在小说阅读器读本章
去阅读
SQL注入
a.SQL注入原理:
原理:在数据交互中,前端的数据传入到后台处理时,由于后端没有做严格的判 断,导致其传入的“恶意攻击语句”拼接到SQL语句中后,被当作SQL语句的一部分执行。
1.SQL注入分类:
a.根据有无回显
i.有回显:联合查询,报错注入
ii.无回显(盲注):布尔盲注,时间盲注(延时注入)
b.根据数据类型
i.数字型注入
ii.字符型注入ps:数字型注入与字符型注入的最大区别在于,数字型不需要单引号闭合,而字符串类型一般要使用单引号来闭合
c.根据注入的位置
i.GET注入
ii.POST注入
iii.Head注入
iv.Cookie注入等等
2.详细利用方法,以及利用到的相关函数
a.联合查询
i.原理:在SQL中,UNION操作符用于合并多个SELECT语句的结果,实现“纵向”拼接。而UNION查询注入则是通过添加额外的SELECT查询,将结果注入到原始查询中。
ii.利用方法:
§首先判断是否存在是否存在注入点,使用单引号和双引号进行判断是否存在注入点
问:当单引号或者双引号被过滤时应当如何进行操作
答:首先,我会尝试确定是否存在SQL注入点。这通常通过向输入字段插入单引号(’)和双引号(”)等特殊字符来观察应用程序的反应。如果应用程序返回了数据库错误消息,或者行为发生了异常(如页面崩溃、查询结果变化等),这可能表明存在SQL注入漏洞。
然而,当单引号和双引号被过滤时,我会考虑使用其他方法来绕过这些限制。一种常见的方法是使用SQL函数或操作符将特殊字符转换为它们的ASCII码或十六进制表示,然后再重新转换为字符。例如,单引号(’)可以表示为CHAR(39)或UNICHAR(0x0027)。类似地,双引号(”)可以表示为CHAR(34)或UNICHAR(0x0022)。
此外,我还会考虑使用其他注入技术,如布尔型注入、时间延迟注入等,来进一步检测和利用潜在的SQL注入漏洞。
§使用order by进行判断列
§正确判断列后,找到可以正常回显的位置处,使用union查询构造select语句进行查询,但是得保证select语句与返回相关数量的列
b.布尔盲注
i.原理:布尔盲注是一种SQL注入攻击技术,它利用了数据库查询语句的逻辑判断特性。攻击者通过构造特定的注入语句,使数据库执行查询并返回一个布尔值(通常为真或假),然后根据页面的不同响应来判断这个布尔值,进而逐步获取数据库中的数据
ii.相关函数: :length()、substr()、mid()、ascii()、ord()、if()
§字符截取: mid、substr
select substr(database(),1,1)
截取结果中的值,从第一个字符开始,截取1个字符
select mid(database(),1,1)
截取结果中的值,从第一个字符开始,截取1个字符
问:在布尔盲注中substr函数被过滤了该如何进行绕过
答:
1.使用mid函数:
omid函数与substr功能相似,用于从字符串中提取子字符串。
o如果substr被过滤,但mid未被过滤,你可以使用mid作为替代。
o例如,mid(username, 1, 1)等价于substr(username, 1, 1)。
2.利用substring函数:
osubstring函数也是用于提取子字符串的,它提供了不同的语法格式。
o你可以使用substring(str, pos, len)或substring(str from pos for len)(在MySQL中)来替代substr。
3.考虑使用from … for …语法:
o在某些数据库系统中,即使substr被过滤,你仍然可以使用from … for …语法来提取子字符串。
o例如,在MySQL中,substr(username, 1, 1)可以被替换为substr(username from 1 for 1)。
4.利用其他字符串函数:
o根据数据库系统的不同,可能还有其他字符串函数可用,如left和right。
o这些函数虽然不如substr直接,但可以通过组合使用来达到提取子字符串的目的。
§计算字符的ASCII值 :ascii()、ord()
返回字符串第一个字符的 ASCII 值
select ascii(‘hello’); select ord(‘hello’);
将截取出来的字符,转换成ASCII码,以便于后轉做辡算
select ascii(substr(database(),1,1)); select ord(substr(database(),1,1));
§计算字符段长度:leng()
返回当前数据库长度
select length(database());
§计算行数:count()
返回查询结果行数
select count(username) from users;
§特殊函数: left()、right()
返回当前数据库昀左辚的1个字符串
select left(database(),1);
返回当前数据库昀右辚的1个字符串
select right(database(),1);
c.时间盲注
i.原理:时间盲注是一种SQL注入攻击技术,它利用数据库查询执行时间的差异来判断注入的SQL语句是否有效。由于目标网站没有提供直接的错误或正确页面回显,攻击者需要依靠页面响应时间的微妙变化来推断数据库中的信息。
ii.相关函数: if()、sleep()、benchmark()等
§if()
if(condition,expr1,expr2) 功能:如果condition的值为TRUE,则返回值为expr1;否则返回值为expr2。
举例: select if(true,1+1,1+2);
§sleep()
sleep(arg1) 功能:arg1为中断的时间,单位为秒
举例: select if(true,sleep(5),2);
§benchmark()
benchmark(arg1,arg2) 功能:arg1操作次数,arg2为表达式
举例: select if(true,benchmark(100000000,’ok’),2);
d.报错注入:
i.原理: 由于开发人员在开发程序时使用了print_r(),mysql_error(),mysqli_connect_error()函数 将数据库的错误信息输出到前端,因此可以人为地使用一些指定的函数来制造报错信息,从而获取报错 信息中特定的信息。
ii.常用的报错函数
updatexml() extractvalue() floor()
§updatexml()函数
updatexml(XML_document, XPath_string, new_value) 第一个参数:xml文档的名称; 第二个参数:xpath格式的字符串; 第三个参数:替换查找到的符合条件的数据。
eg: select updatexml(1,concat(0x7e,(select user()),0x7e),1);
§extractvalue()函数
extractvalue(xml_frag, xpath_expr) 第一个参数:目标xml文档; 第二个参数:Xpath路径法表示的查找路径。
eg:extractvalue(1,concat(0x7e,database(),0x7e));
§floor函数: floor 函数是 mysql 用于取整数的函数,floor() 返回小于等于该值的最大整数。floor函数知识点:https://www.cnblogs.com/sfriend/p/11365999.html报错原理:可见,floor(rand(0)*2的作用就是产生预知的数字序列01101,然后再利用 rand() 的特殊性和group by的虚拟表,最终引起了报错
select count(*),floor(rand(0)*2)x from security.users group by x; x是floor(rand(0)*2)的别名 报错结果entry后面的值1是根据mysql报错原理决定 报错位置是在floor(rand(0)*2)
问:sql报错盲注的原理,包括相关的常用函数?
答:报错盲注的是利用xpath语法错误,,最大回显长度32;常用函数:updatexml()、floor()但是一般上waf了的话updatexml()、floor()函数一般都会被ban掉,其他函数有:geometrycollection(),
multipoint() , polygon() , .multipolygon() .linestring() , multilinestring() , exp()
答:SQL报错盲注是一种利用数据库错误机制来泄露敏感信息的攻击方式。当应用程序未能对用户输入进行充分的验证和过滤时,攻击者可以构造恶意的SQL语句,这些语句在执行时会触发数据库的错误响应。错误信息中可能包含数据库的内部结构、敏感数据或其他有价值的信息
e. 宽字节注入:使用gbk编码, %df 与/组成了一个汉字`綅,使得转义字符不起作用,单引号逃脱
f.堆叠注入:一堆 sql 语句(多条)一起执行。
g.二次注入:特殊字符进行了转义处理,在从数据库中取脏数据,发生二次注入,比如同时注册两个账号 admin,admin’,然后修改admin’密码成功把admin密码修改了
h. DNSlog注入:Dns在域名解析时会留下解析记录,利用load_file()函数发起请求,使用Dnslog接受请 求,可以获取数据。
4.sql注入如何检测:
a.如果是.asp为后缀,则数据库可能是access,
b.如果是.aspx为后缀,则可能是MsSql,
c.如果是.php对应的可能是mysql数据库
d.如果是.jsp,可能是oracl数据库。
5.sql注入如何防御
a.输入验证:对用户输入数据进行验证和过滤,特别是对单引号、双引号、分号等特殊字符进行处 理。可以使用输入过滤函数或正则表达式等方式来实现。
b.参数化查询:使用参数化查询操作数据库,可以将用户输入的数据视为参数而不是 SQL 代码的一部 分,从而避免 SQL 注入攻击。
c.最小化权限原则:在应用程序连接数据库时,给予最小必要的权限,并严格控制数据库访问权限, 以减少攻击者利用 SQL 注入漏洞获取敏感信息的可能性。
d.安全编码标准:统一编码 否则会导致宽字节注入
e.异常信息处理:前端不返回错误信息,在应用程序中添加异常处理机制,可以及时捕获和记录 SQL 注入攻击产生的异常信息,便于管理员及时发现和修复问题。
f.安全审计:通过记录用户行为和操作日志,可以检测和追踪可能存在的 SQL 注入攻击。
6.相关面试题收集:
问:SQL注⼊检测 答:SQL注⼊攻击检测可根据⼊侵事件发⽣的前后进⾏区分,在⼊侵前可以对 Payload 进⾏检 测等⽅式以预防 SQL 注⼊攻击。在⼊侵检测后可以通过对数据库、IIS ⽇志等进⾏检查以进⾏ 判断
问:Sql注⼊加固措施? 答:对于输⼊的字符进⾏过滤 使⽤ PDO 预编译语句处理
问:sql相关语句被过滤,如何绕过答: 1. 编码绕过(url编码,双写url编码,其他编码) 2. 字母大小写,关键词双写 3. 空格过滤:使用空白符或者+代替空格,或者注释符/**/代替 4. 内联注释绕过: 5. 更改请求方式(有时候waf只拦截get),异常方法(waf自检查get,post,改成其他方法) 6. 超大数据包 7. 参数污染:?id=1&id=2(部分WAF在处理的过程中可能只处理前面提交的参数值(id=1),而后端程序在 处理的时候可能取的是最后面的值) fuzz脚本绕过:运行fuzz脚本 将WAF中过滤的敏感字符通过添加%绕过过滤。
问:sql注入写webshell
答:?id=1′ union select 1,””,3 into outfile ‘C:\phpstudy\WWW\sqli\shell.php’#
?id=1′ union select 1,””,3 into dumpfile ‘C:\phpstudy\WWW\sqli\shell.php’#
问:sql注入写webshell的条件
答:
o数据库用户需具备FILE权限(通常为root或高权限账号)
o已知服务器绝对路径(如示例中的C:\phpstudy\WWW\sqli\)
oMySQL的secure_file_priv参数未限制文件导出
问:sqlmap写shell的条件?答:
1.拥有数据库dba权限为True 查看: python sqlmap.py -u “http://192.168.139.137/sql/Less-1/?id=1” –is-dba
2.知道网站的绝对路径 python sqlmap.py -u “http://192.168.139.137/sql/Less-1/?id=1” –sql-shell sql-shell> select @@datadir;
3. secure_file_priv= 值为空
问:解释一下这个语句 sqlmap –os-shell
答:sqlmap会生成两个文件,一个是文件上传脚本文件,一个是PHP一句话木马文件 我们可以通过它的文件上传脚本上传一句话或者是通过他的生成的一句话文件链接菜刀进行管理。
问:时间盲注如何提高效率呢(禁止使用脚本和工具)?
答:
1. dnslog注入提升SQL时间盲注效率
2. 利用二分法减少猜测的次数。例如,如果要猜测一个字符的ASCII码,可以将范围从0-255缩小为两个 部分,然后逐步缩小范围。
3. 二进制延时注入加速。将ascii码转换为二进制,然后判断首位是0还是1,从而来更快的判断出数据库名 字
问:数据库:MySQL、SQLServer、Oracle、PostgreSQL、Access,另外常见的还有Redis缓存数据库的端口号?
答:
1.MySQL:3306
2.MSSQL:1433
3.Oracle:1521
4.postgreSQL:5432
5.Access比较特殊,它是个文件,没有端口
6.Redis:6379
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:跃鹰sec yu9ing yu9ing《2026年护网行动HVV高频面试题-SQL注入》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论