一.CTF
ctf簡介
CTF(Capture The Flag,奪旗賽)CTF 的前身是傳統黑客之間的網絡技術比拼游戲,起源於 1996 年第四屆 DEFCON,以代替之前黑客們通過互相發起真實攻擊進行技術比拼的方式。 CTF是一種流行的信息安全競賽形式,其英文名可直譯為“奪得Flag”,也可意譯為“奪旗賽”。其大致流程是,參賽團隊之間通過進行攻防對抗、程序分析等形式,率先從主辦方給出的比賽環境中得到一串具有一定格式的字符串
或其他內容,並將其提交給主辦方,從而奪得分數。為了方便稱呼,我們把這樣的內容稱之為“Flag”。 flag所表示的為目標服務器上存儲的一些敏感機密
的信息, 這些信息正常情況下是不能對外暴露的。選手利用目標的一些漏洞,獲取到flag,其表示的即為在真實的黑客攻擊中竊取到的機密信息。 一般情況下flag擁有固定格式為flag{xxxxx}
通常來說CTF是以團隊為單位進行參賽。每個團隊3-5人(具體根據主辦方要求決定),在整個比賽過程中既要每個選手擁有某個方向的漏洞挖掘能力,也要同隊選手之間的相互配合
取自 ctfhub
ctf題目類型
在CTF中主要包含以下5個大類的題目,有些比賽會根據自己的側重點單獨添加某個分類,例如移動設備(Mobile)
, 電子取證(Forensics)
等,近年來也會出來混合類型的題目,例如在Web中存在一個二進制程序,需要選手先利用Web的漏洞獲取到二進制程序,之后通過逆向或是Pwn等方式獲得最終flag
Web
Web類題目大部分情況下和網、Web、HTTP等相關技能有關。主要考察選手對於Web攻防的一些知識技巧。諸如SQL注入
、XSS
、代碼執行
、代碼審計
等等都是很常見的考點。一般情況下Web題目只會給出一個能夠訪問的URL。部分題目會給出附件
Pwn
Pwn類題目重點考察選手對於二進制漏洞的挖掘和利用
能力,其考點也通常在堆棧溢出
、格式化漏洞
、UAF
、Double Free
等常見二進制漏洞上。選手需要根據題目中給出的二進制可執行文件進行逆向分析,找出其中的漏洞並進行利用,編寫對應的漏洞攻擊腳本(Exploit
),進而對主辦方給出的遠程服務器進行攻擊並獲取flag通常來說Pwn類題目給出的遠程服務器信息為nc IP_ADDRESS PORT
,例如nc 1.2.3.4 4567
這種形式,表示在1.2.3.4
這個IP的4567
端口上運行了該題目
Reverse
Re類題目考察選手逆向工程
能力。題目會給出一個可執行二進制文件,有些時候也可能是Android的APK安裝包。選手需要逆向給出的程序,分析其程序工作原理。最終根據程序行為等獲得flag
Crypto
Crypto類題目考察選手對密碼學
相關知識的了解程度,諸如RSA
、AES
、DES
等都是密碼學題目的常客。有些時候也會給出一個加密腳本和密文,根據加密流程逆推出明文。
Misc
Misc意為雜項,即不包含在以上分類的題目都會放到這個分類。題目會給出一個附件。選手下載該附件進行分析,最終得出flag
常見的題型有圖片隱寫、視頻隱寫、文檔隱寫、流量分析、協議分析、游戲、IoT相關等等。五花八門,種類繁多tfhub
比賽形式
線上
選手通過主辦方搭建的比賽平台在線注冊,在線做題並提交flag,線上比賽多為解題模式,攻防模式較為少見。通常來說對於長時間未解出的題目,主辦方會酌情給出提示(Hint
)來幫助選手做題。
線下
選手前往比賽所在地,現場接入比賽網絡進行比賽,線下多為AWD模式,近年來隨着比賽賽制的不斷革新,線下賽也會出現多種模式混合進行,例如結合解題+AWD,解題+RW 等等
AWD:Attack with Defense(AwD)全稱攻防模式,在攻防模式CTF賽制中,參賽隊伍連接到同一個網絡空間。主辦方會預先為每個參賽隊分配要防守的主機,該主機稱之為
GameBox
,每個隊伍之間的GameBox配置及漏洞是完全一致
的,選手需要防護自己的GameBox不被攻擊的同時挖掘漏洞並攻擊對手服務來得分。在AwD中主辦方會運行一個名為Checker
的程序定時檢測選手的GameBox的運行狀態。若檢測到狀態不對則判定該GameBox宕機,按照規則扣除一定分數。攻防模式CTF賽制可以實時通過得分反映出比賽情況,最終也以得分直接分出勝負,是一種競爭激烈,具有很強觀賞性和高度透明性的網絡安全賽制。在這種賽制中,不僅僅是比參賽隊員的智力和技術,也比體力(因為比賽一般都會持續24至48小時左右),同時也比團隊之間的分工配合與合作。 AwD通常僅包含Web
及Pwn
兩種類型的題目。每個隊伍可能會分到多個GameBox,隨着比賽的進行,最早的GameBox可能會下線,同時會上線新的GameBox。
RW:Real World(RW) 首次於2018年
長亭科技
主辦的RealWorldCTF中出現,該賽制着重考察選手在面對真實的環境下的漏洞挖掘與利用能力。通常RW模式出題也會圍繞着能夠應用於真實滲透攻擊當中的漏洞,一般來說RW常見題型為VM/Docker逃逸、針對瀏覽器的攻擊、針對IoT/Car等設備的攻擊,Web類攻擊等等 在RW賽制中會有一個Show Time
,當選手認為自己已經可以完成題目時,選手可以在比賽平台上提交展示申請,由工作人員根據申請先后順序進行展示排期。選手展示之前需要上台並連接相關網絡,同時現場大屏會切換至目標的正常頁面。選手確認連接並測試OK之后開始計時。一般情況下上台攻擊的時間為5分鍾
,選手一旦完成攻擊現場大屏幕會實時看到攻擊的效果,此時裁判會根據效果是否符合題目要求來判定該題是否完成。如5在攻擊時間內依然未能看到展示效果則認為本次攻擊失敗。現如今為了防止選手惡意排期。通常會有一個隊伍總展示次數(例如在2019年數字經濟雲安全公測大賽中每個隊伍只允許上台展示30次),選手也需要盡可能保證上台之后攻擊的成功率 舉個例子。題目要求需要攻擊位於比賽網絡中的某個網站並將首頁替換為包含隊伍名稱的頁面。題目給出該網站的一些信息(源代碼/數據庫等等),選手經過本地挖掘漏洞之后,提交展示申請,排期到了之后進行上台展示。注意,因為RW模式是以展示效果來作為題目是否完成的准則,所以在RW模式中並不存在Flag
。
ctf平台:
https://ctf.show/challenges
https://www.xctf.org.cn/xctf/2020/
https://buuoj.cn/login?next=%2Fchallenges%3F
https://ctf.bugku.com/
https://www.jarvisoj.com/login
https://www.ctfhub.com/#/index
安全論壇
https://xz.aliyun.com/
https://www.anquanke.com/
https://www.ichunqiu.com/
https://www.freebuf.com/
https://bbs.pediy.com/
https://www.hetianlab.com/
https://www.52pojie.cn/
意義
二.php
解釋性語言
基礎語法
PHP即“超文本預處理器”,是一種通用開源腳本語言。PHP是在服務器端執行的腳本語言,與C語言類似,是常用的網站編程語言。PHP獨特的語法混合了C、Java、Perl以及 PHP 自創的語法。利於學習,使用廣泛,主要適用於Web開發領域。
注釋
(一) 以//開始.
(二) 以#開始.
(三) 多行注釋有一種以/*開始以 */結束
php中單引號與雙引號的區別?
1. 雙引號的變量是解析並輸出,而單引號的變量不解析。
2. 單引號的解析速度比雙引號的快
演示:
$age = 22;
$str1 = '他今年 $age 歲'; //''原樣輸出
$str2 = "他今年 $age 歲"; //""要解析里面的`變量 即輸出22
echo $str1;
變量, 常量
數組
$c=["zhangsan","lisi"];
echo $c[1];
三.ctf中php tricks
3.1 強弱類型比較
== 是弱類型比較,兩個不同類型比較時,會自動轉換成相同類型后再比較值
===是強比較,需要比較值和類型
<?php
if("admin"==0) //true
if("1admin"==1)//true
if("admin1"==1)//false
if("0e12324"=="0e1324")//true
php弱類型比較中,數字和字符串比較中,字符串轉換成數字的過程中,會取字符串前面數字的值作為整個字符串轉換成數字的值,比較“1admin”,轉換成數字就是1,所以"admin1"的話,因為字符串沒有數字,只能轉換成0了,所以第一個才會是true。 而最后一個則是被php當成科學計數法的,計算,所以結果都是0,比較時會相等。
md5弱比較繞過(==)
== 會將兩個變量變為同類型比較,所以尋找兩個明文不同但md5值為"0exxxxx"的字符串,因為0exxxx會被看成科學計數法,所以0exxxx都為0,所以相等。
0e開頭的md5和原值:
QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
............
md5強類型比較(===)
數組繞過
源碼
<?php
error_reporting(0);
include 'flag.php';
$a = $_GET['a'];
$b = $_GET['b'];
if($a!= $b && md5($a) == md5($b)){
echo $flag;
}
?>
3.2 strcmp函數的繞過
strcmp()函數用於比較兩個字符串
strcmp( string$ str1, string$ str2)
參數str1第一個字符串.str2第二個字符串。如果str1小於str2返回<0;如果str1大於str2返回> 0;如果兩者相等返回0(注意相等返回0這個特性)
但是如果此函數參數中有一個不合法的參數(對象,數組等),就會報錯並返回0(在php 5.2版本之前,利用strcmp函數將數組與字符串進行比較會返回-1,但是從5.3開始,會返回0)
源碼
<?php
error_reporting(0);
include "flag.php";
if(isset($_GET['password']))
if (strcmp($_GET['password'],$flag)==0)
die('Flag: '.$flag);
else
print 'Invalid password';
?>
3.3 Eregi匹配
注意:php版本=5.3
ereg()函數用指定的模式搜索一個字符串中指定的字符串,如果匹配成功返回true,否則,則返回false。搜索字母的字符是大小寫敏感的。
1.數組
ereg是處理字符串,傳入數組之后,ereg是返回NULL
2.%00截斷 sadasd%00wwww
源碼
<?php
error_reporting(0);
if(ereg("zut",$_GET['a']))
{
echo 'success';
}
else
{
echo 'failure';
}
3.4 intval()函數
php intval 返回值是int
源碼
if(isset($_GET['num'])){
$num = $_GET['num'];
if(preg_match("/[0-9]/", $num)){
die("no no no!");
}
if(intval($num)){
echo $flag;
}
}
數組繞過
intval('4476.0')===4476 小數點
intval('+4476.0')===4476 正負號
intval('4476e0')===4476 科學計數法
intval('0x117c')===4476 16進制
intval('010574')===4476 8進制
intval(' 010574')===4476 8進制+空格
3.5 is_numeric()函數
這個函數用來判斷傳入的值是否是一個數字,這個函數判斷的范圍比較廣,返回值為ture或false,
is_numeric函數對於空字符%00,無論是%00放在前后都可以判斷為非數值,而%20空格字符只能放在數值后。所以,查看函數發現該函數對對於第一個空格字符會跳過空格字符判斷,接着后面的判斷!
源碼
<?php
include "flag.php";
$num=$_GET['num'];
if(!is_numeric($num))
{
//echo "數值為:".$num;
echo "<br/>";
if($num==123)
echo $flag;
}
else
echo "他不能是數字哦";
?>
3.6 extract變量覆蓋
extract() 該函數使用數組鍵名作為變量名,使用數組鍵值作為變量值。針對數組中的每個元素,將在當前符號表中創建對應的一個變量。
源碼
<?php
error_reporting(0);
include 'flag.php';
extract($_GET);
if (isset($y))
{
$content = trim(file_get_contents($x));
if ($y == $content)
{
echo $flag; }
else
{
echo 'Oh..';} }
?>
拓展: 偽協議
php 偽協議
a=999&b=data://,999
拓展:$$變量覆蓋題目
$a = 'abc';
$$a = 789;
echo $abc;