SQL注入漏洞-绕过

绕过条件过滤

掌握了基本的注入手段。但是随着网站开发人员的安全意识的提高,纷纷使用了各种防注入的手段。最简单的就是条件过滤了。条件过滤,顾名思义就是黑名单机制,过滤掉符合条件的语句。因此我们要想办法绕过过滤,用其他方式来实现注入。

绕过伪静态

伪静态:伪静态通俗点说就是假的静态页面,也就是通过各种技术手段,让动态页面的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

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值