SQL注入:
select *from news where id='1' => id传参1
闭合单引号,注释掉后面单引号(让我们的输入跳出单双引号)
魔术引号是什么?
magic_quotes_gpc(魔术引号开关)
但引号、双引号、反斜杠(\)等字符都会被加上反斜杠
magic_quotes_gpc的作用:当PHP的传参中有特殊字符就 会在前面加转义字符'\',来做一定的过滤。
低版本(php5.3) 修改配置文件然后强制运行
magic_quotes_gpc
高版本(php5.4)删除掉这个配置,用过特定的函数使用
Addslashes()
魔术引号:
不让你闭合?
绕过
1.找不需要闭合的地方
Select*from news where id=1
2.仔细查看作用域
$_SERVER
3.宽字节注入
无论是啥编码,最终都是转换为二进制(1/0)
汉字 => ASCII 数字
多字符编码=>多个字符组在一起成为一个字
GBK = 双字节编码
产生歧义:
英文编码:abcd => 用中文解码
编码不同歧义
单字节(ASCII能找到的全是单字节)
\ => 92(ASCII)单字节
两个单字节 => 双字节
select*from news where id='1?\' '
url编码 => 16进制
数据库使用GBK编码可能存在宽字节注入
传一个字符,将反斜杠吃掉成为汉字
尝试 => 我试试看宽字节
%df\ => 凑成汉字
df5c => 運
1.替代法 :'widechar' => database()
子查询的嵌套:'user' => select table_name from information_schema.tables where table_schema=database() limit 0,1)
2.16进制法:(标识)
mysql支持16进制输入 替代字符串
'user' => 0x75736572
sqlmap有的时候需要手动帮助闭合
%df = url编码后的内容
BP抓包改hex
或者直接传参汉字:聂' or 1=1 -- q
课程回顾:
1.union联合查询 get注入
2.工具使用(谷歌浏览器插件、bp、sqlmap)
3.updatexml报错注入 POST/head传参
4.盲注 (布尔 、时间)ASCII /substr/sleep /concat/group_concat/子查询
5.宽字节:绕过魔术引导 %df或者任何能和\结合的东西、汉字 ,16进制编码0x ,子查询的嵌套
思路:
1.找不用闭合
2.找作用域
非utf_8非英文编码都可行(这里指数据库编码,与前后端都没啥关系)