注入绕过有很多很多种,原理基本类似,在我看来有函数过滤和字符过滤两种。(因为比较菜,所以目前只讲一下字符过滤好了)
这里我选择的是根据实例进行解释(更适合小白)(会在最后进行总结,把各种方式都列出来的)
0x01(这里跟一下隔壁的风)
字符过滤,顾名思义,就是把可能在注入中出现一些字符过滤掉以此来防止注入。
那么问题来了,怎么看他是把哪种字符给过滤了呢?
- 在之前,我以为是通过报错才进行判断,接触注入绕过以后,发现不现实,因为只会告诉你在哪个位置有错却不会告诉你具体的东西,那么究竟该如何判断呢?
方法很简单,构建一个逻辑上一定正确的语句,然后将将你怀疑的字符构造进去进行查询,学名叫做异或注入
异或注入:两个条件相同(同真或同假)即为假,异或符号未^,两个条件就是1和后面的语句。在这里我们举个例子。
1.这里的%27,%23都是url编码,这里是没有错误的
2.这里就出现了错误,再结合一开始的文字分析,是不是就明白了。这是id后面的内容首先要和^后面的内容进行异或,因为异或以后id变为0,数据库查找不到信息,所以产生错误。
总而言之就是括号里得到内容如果为真则会产生错误,为假则会正常运行,我们可以利用这个进行判断哪些字符被过滤掉了。
3.这样判断过滤,当然不排除过滤了大于号,单引号,空格,括号,注释符等等,那些之后再讲
4.接下来就是绕过方式,采取在union中再加一个union,即uniunionin这种(学名双写关键字绕过),再过滤掉其中的union后恰好剩下一个union(当然,不排除那种丧心病狂的开发人员比如隔壁进行连续过滤,即发现过滤内容的话,就把过滤完把数据传回一开始再过滤,这样的话就不好用了),如图所示
其实还可以利用大小写,16进制,内联注释等等方法绕过,改天细讲。
0x02
- 看代码,如果发现有and,or,sleep,直接停止,然后再把空格删掉。(这里是最开始带着错误理解写的,因为题目简单所以直接给了源码,现实中是不存在的)
- 在这里我们先用老方法试一下,发现不行
- 要注意顺序,根据反馈的日志信息进行修改,这里是先把空格替换成/**/然后再替换and,or,sleep
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
未完待续。。。