sql注入绕过(随时更新)

注入绕过有很多很多种,原理基本类似,在我看来有函数过滤和字符过滤两种。(因为比较菜,所以目前只讲一下字符过滤好了)

这里我选择的是根据实例进行解释(更适合小白)(会在最后进行总结,把各种方式都列出来的)

0x01(这里跟一下隔壁的风)

字符过滤,顾名思义,就是把可能在注入中出现一些字符过滤掉以此来防止注入。

那么问题来了,怎么看他是把哪种字符给过滤了呢?

  • 在之前,我以为是通过报错才进行判断,接触注入绕过以后,发现不现实,因为只会告诉你在哪个位置有错却不会告诉你具体的东西,那么究竟该如何判断呢?

方法很简单,构建一个逻辑上一定正确的语句,然后将将你怀疑的字符构造进去进行查询,学名叫做异或注入

异或注入:两个条件相同(同真或同假)即为假,异或符号未^,两个条件就是1和后面的语句。在这里我们举个例子。

1.这里的%27,%23都是url编码,这里是没有错误的
1
2.这里就出现了错误,再结合一开始的文字分析,是不是就明白了。这是id后面的内容首先要和^后面的内容进行异或,因为异或以后id变为0,数据库查找不到信息,所以产生错误。

总而言之就是括号里得到内容如果为真则会产生错误,为假则会正常运行,我们可以利用这个进行判断哪些字符被过滤掉了。
2
3.这样判断过滤,当然不排除过滤了大于号,单引号,空格,括号,注释符等等,那些之后再讲
3
4.接下来就是绕过方式,采取在union中再加一个union,即uniunionin这种(学名双写关键字绕过),再过滤掉其中的union后恰好剩下一个union(当然,不排除那种丧心病狂的开发人员比如隔壁进行连续过滤,即发现过滤内容的话,就把过滤完把数据传回一开始再过滤,这样的话就不好用了),如图所示

其实还可以利用大小写,16进制,内联注释等等方法绕过,改天细讲。
4

0x02

  • 看代码,如果发现有and,or,sleep,直接停止,然后再把空格删掉。(这里是最开始带着错误理解写的,因为题目简单所以直接给了源码,现实中是不存在的)
    绕过1
  • 在这里我们先用老方法试一下,发现不行
    绕过2
  • 要注意顺序,根据反馈的日志信息进行修改,这里是先把空格替换成/**/然后再替换and,or,sleep
    绕过3

0x03

当然以上都是很简单的,之后会有大量的补充。

sql注入绕过方式总结:

0x01,单引号绕过(有些人说无解,但那只针对于小白)

绝大部分都会有单引号过滤,当然过滤掉单引号也并不能防止注入

单引号过滤原理:大多数的单引号过滤是通过把单引号转换成其他字符

1.把单引号转化为编码形式

虽然只要是正常人就会对这种编码进行过滤,但好歹也是一种方法,万一碰上傻子呢。

2.进行赋值(代码实例来源于网络)

代码示例1:

http://www./show.asp?id=1;exec master.dbo.xp_cmdshell 'net user angel pass /add';--

代码示例2:

http://www./show.asp?id=1;declare%20@a%20sysname%20select%20@a=

0x6e006500740020007500730065007200200061006e0067

0065006c002000700061007300730020002f006100640064

00%20exec%20master.dbo.xp_cmdshell%20@a;--

这两个sql语句效果完全一样。
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400是“net user angel pass /add”的16进制格式。
先声明一个变量a,然后把指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。比如代码示例:

declare @a sysname
select @a=
exec master.dbo.xp_cmdshell @a

当然不排除有的丧心病狂的开发者对输入数据进行限制,只能输入特定字符或数字类型的数据(这就太恶心了,虽然是事实)

3.避免使用单引号,使用函数进行代替(这才是大神们常用的方式)

简单的如where xtype=’U’,字符U对应的ASCII码是85,所以可以用where xtype=char(85)代替;如果字符是中文的,比如where name=’用户’,可以用where name=nchar(29992)+nchar(25143)代替。

复杂的语句则可以用函数命令进行替换,当然,有的函数也会被过滤

因为我现在比较菜,所以等接触到那种程度在进行补充吧。

4.转义字符(代码来源于网络)

id=replace(trim(request("id")),"'","")

或者

name=name.replaceAll("'", "xxx");

password=password.replaceAll("'", "xxx");

String sql="select * from user_table where username='"+name+"' and password='"+password+"'";

在替换或截掉单引号之后在加上单引号却没有其他限制。

如果是这样写的话,可以通过转义字符( \ ’ ),hex编码,宽字节等方法绕过(具体另讲)

0x02

未完待续。。。

ord=’"+password+"’";`

在替换或截掉单引号之后在加上单引号却没有其他限制。

如果是这样写的话,可以通过转义字符( \ ’ ),hex编码,宽字节等方法绕过(具体另讲)

0x02

未完待续。。。

发布了13 篇原创文章 · 获赞 0 · 访问量 448

猜你喜欢

转载自blog.csdn.net/m0_46230316/article/details/105290474