SQL注入漏洞原理:
SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。构造非法SQL语句,来获取mysql数据库的信息。
SQL注入的危害:
数据库信息泄露、网页篡改、网站挂马、数据库被恶意操控、服务器被远程控制、破坏硬盘数据、
SQL注入的方法:
从注入参数类型分:
数字型注入、字符型注入、搜索型注入
从注入方法分:
基于报错、基于布尔盲注、基于时间盲注、联合查询、堆叠注入、内联查询注入、宽字节注入
从提交方式分:
GET注入、POST注入、COOKIE注入、HTTP头注入
SQL注入绕过方法:
注释符号绕过(--,#,/**/,;),
大小写绕过,
内联注释绕过,
双写关键字绕过,
特殊编码绕过,
空格过滤绕过,
过滤 or and xor not 绕过,
过滤大小于号绕过,
过滤引号、逗号绕过,
函数绕过
SQL注入过waf思路:
1、内联注释绕过
2、填充脏数据绕过
3、更改请求方式,如GET改为POST
4、随机agent绕过
5、fuzz过滤函数,函数替换绕过
6、sqlmap,tamper脚本绕过----上述思路
MySQL注入常用函数:
database() 返回当前数据库名
user() 返回当前数据库用户名,可替代函数:@@user
updatexml() 更新xml文档,常用于报错注入,可替代函数:extractvalue()
mid() 从指定字段中提取出字段的内容
limit() 返回结果中的前几条数据或者中间的数据
concat() 返回参数产生的字符串
group_concat() 分组拼接函数 ,可替代函数:concat_ws()
count() 返回指定参数的数目
rand() 参数0~1个随机数
flood() 向下取整
substr() 截取字符串 ,可替代函数:substring() mid()
ascii() 返回字符串的ascii码
left() 返回字符串最左边指定个数的字符
ord() 返回字符的ascii码
length() 返回字符串长度
sleep() 延时函数
报错注入的函数有哪几个:
1.updatexml()函数,2.extractvalue()函数,3.floor()函数,4.Exp()函数
如何突破注入时字符被转义:
1、宽字节注入,2、hex编码绕过
宽字节注入产生的原理以及根本原因:
宽字节注入主要利用mysql的一个特性,使用GBK编码的时候,会认为两个字符是一个汉字,当php中addslash和magic_quotes_gpc开启时,会对单引号(0x27)进行转义,形成’的形式,\的16进制编码是0x5c,当使用GBK编码时,0x5c前如果出现类似0xdf之类的字符,就会结合形成一个汉字,结果就是0xdf5c27,而0xdf5c会结合成一个汉字,后面的引号(27)自然就再次生效(转义失效,被df吃掉了),这就是宽字节注入的原理。
SQLMap常用参数?
:-u 指定url
-r 指定请求数据包的文本文件
-m 批量跑get注入
–current-db 获取当前数据库
–table 获取指定数据库下的数据表
–tamper 指定tamper脚本,进行bypass
–os-shell 获取shell
–random-agent 随机指定user-agent
MySQL 写 WebShell 有几种方式,利用条件?
一、
union select 后写入
lines terminated by 写入
lines starting by 写入
fields terminated by 写入
COLUMNS terminated by 写入
二、
root 权限
GPC 关闭(能使用单引号),magic_quotes_gpc=On
有绝对路径(读文件可以不用,写文件必须)
没有配置–secure-file-priv
成功条件:有读写的权限,有 create、insert、select 的权限
SQL 注入时当 and、or、单引号等字符被过滤了怎么办?
大小写变形
改变编码
添加注释
往字符里面插入被过滤的字符(双写法)
利用符号形式
数字被注释(1、2等)
使用浮点数
符号被注释(<、>等)
利用函数代替
sql 注入写文件都有哪些函数?
union select "<?php @eval($_POST['123']);?>",2 into outfile
"C:\\phpStudy\\WWW\\123.php"+--+&Submit=Submit
SQL注入的防御:
用户的权限严格区分、强迫使用参数化语句、加强对用户输入的验证、正则表达式过滤、装WAF。