概述
绕过条件过滤
掌握了基本的注入手段。但是随着网站开发人员的安全意识的提高,纷纷使用了各种防注入的手段。最简单的就是条件过滤了。条件过滤,顾名思义就是黑名单机制,过滤掉符合条件的语句。因此我们要想办法绕过过滤,用其他方式来实现注入。
绕过伪静态
伪静态:伪静态通俗点说就是假的静态页面,也就是通过各种技术手段,让动态页面的URL看上去和静态页面的一样。
.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。
我们这里利用.htaccess文件,配置重写引擎,来实现伪静态的效果。
绕过函数过滤
为了保证用户输入的信息不会影响到程序进程,往往会对用户的输入进行处理。之前是对危险字符进行替换,但是有些字符的替换会影响用户的表达,那么就可以用 转义的方法对用户的输入符号进行完整保留。本实验有三个部分,第一部分是自定义转义函数,第二三部分都是用标准的addslashed()函数和 mysql_real_escape_string()来进行转义。
addslashes() 函数在指定的预定义字符前添加反斜杠。
这些预定义字符是:单引号 (')、双引号 (")、反斜杠 ()、NULL
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:x00、n、r、、’、"、x1a
绕过is_numeric过滤
is_numeric()函数用于检测变量是否为数字或数字字符串。
如果将二进制或十六进制数据传递至is_numeric()函数,则也会返回为true,即被is_numeric()函数检测是数字。现在,我们进行测试。编写is_numeric.php文件,并将以下代码输入后,保存。
<?php
$v = is_numeric (0x32DA) ? true : false;
var_dump ($v);
?>
再执行该程序,可得到结果:bool(true)。
vim is_numeric.php
php !$(!$代表上一条命令的最后一个参数,即is_numeric.php)
绕过条件过滤
关键代码为:
首先看到GET方式,要习惯的打一个半角英文单引号。我们这里打一下试试:
这里发现报错了,但是要是按照我们之前使用联合查询获取额外信息,就要注释掉后面的『’ LIMIT 0,1』,但是这里的代码却过滤掉了注释。那怎么办呢?我们这次试试输入『id=1’ or '』,看看可以用布尔方式不。
布尔方式成功,那我们就可以按照初级GET盲注中的布尔方式注入了。先试一下『 id=1' and (select DATABASE()='security') or'』
成功了。由于布尔按真假判断,那我们这里有三个判断,分别是id,and**和or’’,这里的or’’恒为真,当id也为真的时候,控制真假结果就取决于and的值,则符合布尔注入。
一般都SQL注释号为--和#这两个符号在入门SQL注入时用的比较多但是其实还有一个注释号;%00这个也可以用作注释。
可以用爆破注入试一下,以下给出爆破注入的语句以及效果图
爆破注入『id=1' or extractvalue(1,concat(0x7e,database())) or'』
关键代码为:
这次还过滤了and和or,那我们就无法进行布尔判断了。此处可以使用替代的办法,即使用『&&』替代『and』,『||』替代『or』。此处还有个问题,就是preg_replace按照代码中的用法是无限次替换的,但实际中却可以使用『oorr』这样来绕过,这不科学。
关键代码为:
这和上面的差不多,但是这次使用『oorr』这样的方式试一下。
OORR来过滤因为过程OR会把中间两个OR去掉剩下的也是OR
关键代码为:
SQL语句中函数之间是要有空格的,如『and union』不能写成『andunion』,但是函数和变量中可以去掉空格,如『2 = 1』可以写成『2=1』。这个黑名单屏蔽了空白字符以及斜杠星号,意味着用『/**/』伪装成空格的日子一去不复返了。因为空格只是隔开前后函数。
能看到空格和AND还有--都被过滤而我们可以用%20来代替空格,而||和&&这两符合都有自带的空格可以直接使用
绕过UNION&SELECT过滤
关键代码为:
与上一门课程相比,黑名单是越来越长了。我们随便试一下,提交id=12211' union select * from users where id='2'||',然后看一下过滤后还剩下什么了
过滤后惨不忍睹啊。我们再看看上面的代码,正则修饰符不是『i』而是『s』,则意味着匹配的对象是大小写敏感的,那么就简单多了呢。
但是空格和星号还是被吃掉了,继续想办法。在MySQL中tab,空格,回车都可以隔断语句,那么我们就可以用使用/**/ 或() 或+ 代替空格,%0c =换页、%09 = 水平制表符、%0d = 回车、%0a = 换行。那我们试试 『id=12211%27+uniOn%09selEct%0d1,2,password%0dfrom%0dusers%0dwhere%0did=%272%27||%27』
成功了呢。很多不可见的空白字符都可以用哦,你可以试试。
绕过伪静态
.htaccess文件的配置如下:
发现此处的地址栏是类似这样『Less-37/id/1』,目录形式,没有扩展名。那我们把这个1删除试试。发现报错
在1后面添一个单引号咧,果断报错。
因此此处的注入点为数字1后面,并且是显错注入。
发现它打开的页面是『Less-38/id/1.html』。
1.html,貌似是静态网页啊,那我们将1改为2咧。
是正常页面,信息是ID=2人的用户信息。那么我们在后面打个单引号呢
原来这次的注入点在数字部分。
绕过函数过滤
关键代码为:
本代码有三个过滤,第一个是过滤将反斜线替换为双反斜线。第二个和第三个分别是将单引号和双引号转义,即在引号前面添加反斜线。有没有注意本数据库是gbk的,那我们就可以进行『宽字节』注入了。
首先直接注入测试
发现单引号被转义了。我们在URL中插入的单引号之前插入%bf,单引号是%27。反斜线是%5c。『% bf ’』就变成了『 %bf%5c%27 』,相当于再显示就变成了『縗’』,单引号出来了。则最后的SQL语句就变成了『SELECT * FROM users WHERE id='-11縗'union select * from users where id =3-- ' LIMIT 0,1』因此突破了转义函数。
怎么吃的:
GBK编码,它的编码范围是0×8140~0xFEFE(不包括xx7F),在遇到%df(ascii(223)) >ascii(128)时自动拼接%5c,因此吃掉‘’,而%27、%20小于ascii(128)的字符就保留了。
绕过 AddSlashes() 函数, 这个和上一个程序一样,就是 『id=$id』,没有了单引号,那addslashes函数可以算是无用了。
绕过MySQL_real-escape_string函数,这里我们用的函数变成了mysql_real_escape_string,它比addslashes函数多转义了换行符、制表符等。理论上这个函数是很安全,而且能避免宽字节注入的。
但我们依旧可以使用宽字符绕过。
SQL语句为『id=-1%bf%27+union+select+*+from+users+where+id+=3—+』
绕过is_numeric过滤
访问目标网站,如下图所示:
通过查看源代码,在最后一行发现注释中包含“index.phps”文件,于是再访问该文件:http://10.1.1.8/index.phps,可查看到index.php的源代码:
从源代码中可以分析出,服务器从POST获得id标签的值,首先利用is_numeric()函数判断id是否为数字或数字字符串,如果不是,则提示“hacking attemp(发现黑客尝试攻击行为)”,如下图所示。
可以用十六进制或者二进制绕过is_numeric,形成SQL注入。
绕过is_numeric()的方法:将SQL注入的payload转换为十六进制表示。
例如,payload为2’ and 1=1,则先选中该payload,利用Firefox中的hackbar工具,选择Encoding-->HEX Encoding-->String to 00ff00ff,即可完成十六进制转换,转换结果为322720616e6420313d31;接着,为了让PHP知道该字符串是十六进制数据,还需要在前面加上0x,最终变成0x322720616e6420313d31。
flag存在于mysql数据库的某个表中。尝试绕过is_numeric的限制实现SQL注入攻击,获取flag。
利用Firefox的hackbar工具,可以将payload进行十六进制转码。如下图所示,我们将payload=“-1 union all select database()”进行转码(注意:在转码后,还须在十六进制字符串前加上0x)实现SQL注入,获取到了数据库的名称:task
最后
以上就是整齐鞋垫为你收集整理的SQL注入漏洞-绕过绕过条件过滤绕过UNION&SELECT过滤绕过伪静态绕过函数过滤绕过is_numeric过滤的全部内容,希望文章能够帮你解决SQL注入漏洞-绕过绕过条件过滤绕过UNION&SELECT过滤绕过伪静态绕过函数过滤绕过is_numeric过滤所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复