为什么注入失败?

由于开发者对于数据类型和SQL语句写法(框架写法)导致SQL注入拼接失败。

注释类型包括:单引号’、百分号%’、框架括号’)

有时候会有无法注释的情况:limit 0, 1order by

–+

常见注释类型

1、数字型(无符号干扰)

select * from news where id=$id;

2、字符型(有符号干扰)

select * from news where id='$id';

3、搜索型(有多符号干扰)

select * from news where id like '%$id%'

4、框架型(有各种符号干扰)

select * from news where id=('$id');

select * from news where (id='$id');

文件上传有可能会导致注入!

img = union select

img_value { 'union select' }

插入数据事件insert

insert news ("title", "content", "author", "date", "img")

PHP-MYSQL-数据请求方法(常见)

全局变量方法:GET POST SERVER FILES HTTP头等

1、GET:URL上
2、POST:URL看不到,但不代表不存在,也是注入点,可用BP抓包改参数
3、SERVER:(主要看功能或代码里接收哪个,就改哪个)

User-Agent:

使得服务器能够识别客户使用的操作系统,游览器版本等.(很多数据量大的网站中会记录客户使用的操作系统或浏览器版本等存入数据库中)

Cookie:

网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据

Rerferer:浏览器向 WEB 服务器表明自己是从哪个页面链接过来的

Host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号

4、X-Forwarded-For:

简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,(通常一些网站的防注入功能会记录请求端真实IP地址并写入数据库or某文件 [通过修改XXF头可以实现伪造IP])

若在代码中X-Forwarded-For获取到的IP变量写进了sql执行语句中,则可以实现注入。

1
2
3
4
5
6
7
#源代码中的隐患语句
$sql = "select * from admin where ip='$ip'";
#数据包中X-Forwarded-For参数(IP)修改
dasdsdas' union select 1,datebase(),user(),4 and '1'='1

#如果把ip写死去判断,有绕过隐患,ip放在配置文件或代码申明中
if($ip=='127.0.01'){...}
功能点

1、用户登录时

2、登录判断IP时

是PHP特性中的$_SERVER['HTTP_X_FORWARDED_FOR'];接受IP的绕过(可伪造,绕过)

实现:代码配置固定IP去判断-策略绕过

实现:数据库白名单IP去判断-select注入

实现:防注入,记录IP去保存数据库-insert注入

3、文件上传将文件名写入数据库-insert注入

PHP-MYSQL-数据请求格式

1、数据采用统一格式传输,后端进行格式解析带入数据库(json

2、数据采用加密编码传输,后端进行解密解码带入数据库(base64)-CapyfCncoder V3