1. 程式人生 > >CTF之程式碼審計彙總

CTF之程式碼審計彙總

  最近在做bugku中程式碼審計的題目,發現了web題目中存在著大量的php漏洞以及弱型別函式的繞過問題,現在藉著bugku中的題目來統一的整理一下。希望通過整理可以溫故而知新。
第一題:extract變數覆蓋 焦點:extract($_GET)

<?php $flag='xxx'; extract($_GET); if(isset($shiyan)) { $content=trim(file_get_contents($flag)); if($shiyan==$content) { echo'flag{xxx}'; } else { echo'Oh.no'; } } ?>

  該題目中extract函式並沒有使用第二個引數,即函式得到兩個value相同的key時,後一個產生的變數的值將覆蓋前一個變數的值。參考payload:?shiyan&flag
第二題

:strcmp比較字串 焦點:if (strcmp($_GET[‘a’], $flag) == 0)

<?php $flag = "flag{xxxxx}"; if (isset($_GET['a'])) { if (strcmp($_GET['a'], $flag) == 0) //如果 str1 小於 str2 返回 < 0; 如果 str1大於 str2返回 > 0;如果兩者相等,返回 0。 //比較兩個字串(區分大小寫) die('Flag: '.$flag); else print 'No'; } ?>

這個函式是用於比較字串的函式 int strcmp ( string $str1 , string $str2 ) 引數 str1第一個字串。str2第二個字串。
如果 str1 小於 str2 返回 < 0;
如果 str1 大於 str2 返回 > 0;
如果兩者相等,返回 0。
重點:任意陣列通過strcmp和任意字串相比較的結果都是NULL
陣列和字串比較永遠都是零,已知flag{xxxxx}為字串,那麼我們就構造a為陣列
參考: ?a[]

第三題:urldecode二次編碼繞過 焦點:GET[id]=urldecode(_GET[id] = urldecode(_GET[id])

<?php if(eregi("hackerDJ",$_GET[id])) { echo(" not allowed! "); exit(); } $_GET[id] = urldecode($_GET[id]); if($_GET[id] == "hackerDJ") { echo " Access granted! "; echo " flag "; } ?>

程式碼一開始使用eregi判斷
if(eregi(“hackerDJ”,$_GET[id])) {
echo("
not allowed!
如果,傳入的id的值為hackerDJ,則返回not allowed
  下邊使用urldecode對id的值進行解碼,所以可以讓id得到的值是hackerDJ的url編碼,由於瀏覽器會自行解碼一次,所以編碼兩次就好,因為要對hackerDJ編碼,但是hackerDJ不是規則的,我們需要對著ascii碼錶編碼兩次。其實沒有必要將hackerDJ全部進行二次編碼,在這裡我們僅對D進行編碼,查ascii碼錶:D對應的ascii碼為44,然後再找一個線上URL編碼網站,%44 URL編碼後為 %2544
參考:?id=hacker%2544J
第四題

:md5()函式
MD5函式在對陣列加密的時候會返回NULL
參考:?username[]=1&password[]=2

第五題:陣列返回NULL繞過

<?php $flag = "flag";   if (isset ($_GET['password'])) { if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE) echo 'You password must be alphanumeric'; else if (strpos ($_GET['password'], '--') !== FALSE) die('Flag: ' . $flag); else echo 'Invalid password'; } ?>

本題突破口:
if (ereg ("^[a-zA-Z0-9]+$", $_GET[‘password’]) === FALSE)
else if (strpos ($_GET[‘password’], ‘–’) !== FALSE)
首先password引數必須被修改過,其次它是個陣列,進行陣列繞過。
參考:?password[]
第六題:sha()函式比較繞過

<?php $flag = "flag"; if (isset($_GET['name']) and isset($_GET['password'])) { var_dump($_GET['name']); echo " "; var_dump($_GET['password']); var_dump(sha1($_GET['name'])); var_dump(sha1($_GET['password'])); if ($_GET['name'] == $_GET['password']) echo ' Your password can not be your name! '; else if (sha1($_GET['name']) === sha1($_GET['password'])) die('Flag: '.$flag); else echo ' Invalid password. '; } else echo ' Login first! '; ?>

  題目說是sha1函式的繞過,sha1和md5都是在同時期被爆出加密陣列返回NULL的漏洞,所以這道題和md5的思路一樣。
參考payload:?name[]=1&password[]=2
第七題:md5加密相等繞過 焦點:

$a != 'QNKCDZO' && $md51 == $md52
<?php $md51 = md5('QNKCDZO'); $a = @$_GET['a']; $md52 = @md5($a); if(isset($a)){ if ($a != 'QNKCDZO' && $md51 == $md52) { echo "flag{*}"; } else { echo "false!!!"; }} else{echo "please input a";} ?>

  解題思路是檢視QNKCDZO的md5值,發現是0e開頭的字串,php在判斷所有0e開頭的字串都認為是相等的,所以再找出一個字串md5得值也是0e開頭即可。("==“為等於運算子,”==="為全等運算子,===更為嚴格,使用===時將不會出現該錯誤)
參考payload:?a=s878926199a

第八題:十六進位制與數字比較

<?php error_reporting(0); function noother_says_correct($temp) { $flag = 'flag{test}'; $one = ord('1'); //ord — 返回字元的 ASCII 碼值 $nine = ord('9'); //ord — 返回字元的 ASCII 碼值 $number = '3735929054'; // Check all the input characters! for ($i = 0; $i < strlen($number); $i++) { // Disallow all the digits! $digit = ord($temp{$i}); if ( ($digit >= $one) && ($digit <= $nine) ) { // Aha, digit not allowed! return "flase"; } } if($number == $temp) return $flag; } $temp = $_GET['password']; echo noother_says_correct($temp); ?>

  該題目不允許輸入1-9的數字,並且輸入的資料要與$number的值相等,因為是"==",所以可以採用16進位制輸入
num = 3735929054
print (’%#x’%num)
輸出結果為:0xdeadc0de 參考:?password=0xdeadc0de

第九題:ereg正則%00

<?php $flag = "xxx"; if (isset ($_GET['password'])) { if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE) { echo ' You password must be alphanumeric '; } else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999) { if (strpos ($_GET['password'], '-') !== FALSE) //strpos — 查詢字串首次出現的位置 { die('Flag: ' . $flag); } else { echo(' - have not been found '); } } else { echo ' Invalid password '; } } ?>

  這道題目可以用一個簡單的思路去解,首先,陣列恆大於數字,其次,用strlen測量陣列長度返回值為NULL,同樣用strpos返回值也是NULL,然後本題目用的是嚴格的運算子號 “===“和”!==”,ereg返回值為false沒問題,NULL !== FALSE也沒問題,所以題目就很好解了。
參考payload:?password[]= 或 ?password[]=%00
第十題:strpos陣列繞過

<?php $flag = "flag"; if (isset ($_GET['ctf'])) { if (@ereg ("^[1-9]+$", $_GET['ctf']) === FALSE) echo '必須輸入數字才行'; else if (strpos ($_GET['ctf'], '#biubiubiu') !== FALSE) die('Flag: '.$flag); else echo '騷年,繼續努力吧啊~'; } ?>

  同樣是ereg,上陣列報錯false沒問題,同樣是strpos返回NULL,上陣列返回NULL !== FALSE沒毛病。
參考payload:?ctf[]= 體現ereg的%00繞過可以這樣構造:?ctf[]=%00

第十一題:弱型別整數大小比較繞過

$temp = $_GET['password']; is_numeric($temp)?die("no numeric"):NULL; if($temp>1336){ echo $flag;

  分析:傳入password賦值給temp,is_numeric判斷temp是不是數字,是則die,不是數字就繼續向下執行,再就是傳入的值必須大於1336,上邊提到過,陣列在比較中恆大於具體的值,並且陣列不是數字或者文字型數字,可以繞過數字檢測。
參考:?password[]=

第十二題:數字驗證正則繞過

<?php error_reporting(0); $flag = 'flag{test}'; if ("POST" == $_SERVER['REQUEST_METHOD']) { $password = $_POST['password']; if (0 >= preg_match('/^[[:graph:]]{12,}$/', $password)) //preg_match — 執行一個正則表示式匹配 { echo 'flag'; exit; } while (TRUE) { $reg = '/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/'; if (6 > preg_match_all($reg, $password, $arr)) break; $c = 0; $ps = array('punct', 'digit', 'upper', 'lower'); //[[:punct:]] 任何標點符號 [[:digit:]] 任何數字 [[:upper:]] 任何大寫字母 [[:lower:]] 任何小寫字母 foreach ($ps as $pt) { if (preg_match("/[[:$pt:]]+/", $password)) $c += 1; } if ($c < 3) break; //>=3,必須包含四種類型三種與三種以上 if ("42" == $password) echo $flag; else echo 'Wrong password'; exit; } } ?>

  preg_match在應用於陣列時必然為0,所以42在處理後是0,傳入陣列passwod[]得解
參考:password[]

相關推薦

CTF程式碼審計彙總

  最近在做bugku中程式碼審計的題目,發現了web題目中存在著大量的php漏洞以及弱型別函式的繞過問題,現在藉著bugku中的題目來統一的整理一下。希望通過整理可以溫故而知新。 第一題:extract變數覆蓋 焦點:extract($_GET) <?

程式碼審計系列篇一程式碼審計學習思路

學習程式碼審計要熟悉三種技術,分四部分走一:程式語言  1:前端語言 html/javascript/dom元素使用 主要是為了挖掘xss漏洞 jquery 主要寫一些涉及到CSRF指令碼使用的或者DOM型XSS,JSON劫持等2:後端語言 基礎語法要知道例如 變數型別,常量,陣列(pyt

BugkuCTF程式碼審計題部分(未完待續。。。。)

BugkuCTF之程式碼審計題部分 第一題: 分析程式碼: 首先確定extract()函式的用法,以及引數: 理解了extract()函式就好寫了。 直接 ?shiyan=&falg= 第二題: 這個也是strcmp()函式的繞過,引數傳入一個a陣列 ?a

CTF-PHP程式碼審計,正則表示式記錄

一、PHP自動化的全域性變數:$GLOBALS — 引用全域性作用域中可用的全部變數,一個包含了全部變數的全域性組合陣列。變數的名字就是陣列的鍵。flag In the variable ! <?

CTF-web 第三部分 程式碼審計

http://www.mxcz.net/tools/rot13.aspx rot-13加密解密 http://www.zjslove.com/3.decode/ 凱撒 當鋪 倒敘 維吉尼亞密碼 實際上就是閱讀有關的校驗程式碼,人為構造特殊的輸入或者引數才能拿到flag。需要了解一般的變數

程式碼審計系列篇二滲透技巧

滲透技巧對於程式碼審計的意義在哪? 我們知道程式碼審計的流程中有漏洞發現及payload構造,有的時候在漏洞發現階段灰盒測試比原始碼審計的速度更快效率更高,原始碼審計,你得看程式碼吧,而灰盒測試時,測試語句以上,漏洞就發現了。payload的出現是為了證明漏洞的存在,而payload構造,單單作為一

程式碼審計—Bluecms1.6詳細彙總

0x00 前言 0x01 start SQL 檔案路勁 完成 存在 uploads/ad_js.php √ √ uploads/ann.php √ ╳ uploads/inde

程式碼審計bluecms1.6後臺SQL注入

bluecm1.6版本後臺存在SQL注入 漏洞點連結: http://127.0.0.1/bluecms_v1.6_sp1/uploads/admin/nav.php?act=edit&navid=1 程式碼: elseif($act=='edit') {

PHP程式碼安全【PHP弱口令、加密函式、繞過函式】/CTF程式碼審計

注:結合現在所學,把以前的一些很散的部落格給彙總起來方便利用【刪了黑歷史,哈哈哈】 1、判等型別 1.1、”==”與”===”比較漏洞/switch 如果你認為“==”和"==="最大的區別在於,“==”是判斷數值是否相等,“===”則是判斷數值和型別是否相等,那就錯了,這

Bugku CTF 程式碼審計 writeup(未完待續)

Bugku CTF 程式碼審計 writeup 0x01extract變數覆蓋 extract()函式功能:從陣列中將變數匯入到當前的符號表。使用陣列鍵名作為變數名,使用陣列鍵值作為變數值。 extract(array,extract_rules,pr

PHP程式碼審計實戰XDcms

這裡主要講v2.0.8版本的XDcms中的一個基於錯誤的SQL注入漏洞,較v2.0.7版本而言修復了很多注入漏洞,使得注入漏洞大為減少。 至於CMS的下載配置等就不說了,直接審計吧~ 先整體看,點選index.php,先判斷是否存在檔案config.inc.php,若不存在

小白的程式碼審計路(一)

一般框架中可訪問的方法都要求屬性為public並且方法名要符合命名規範才能被瀏覽器訪問到,在ThinkPHP中預設的規則要求就是隻要方法名為public就可以被訪問。(如SlightPHP中不僅需要方法為public,還需要方法名字首為page.具體可以參考各框架說明)。這樣我們就可以完美的定位檔案和方法了。

PHP程式碼審計片段講解(入門程式碼審計CTF必備)

關於本專案 程式碼審計對於很多安全圈的新人來說,一直是一件頭疼的事情,也想跟著大牛們直接操刀審計CMS?卻處處碰壁: 函式看不懂! 漏洞原理不知道! PHP特性更不知! 那還怎麼愉快審計? 不如化繁為簡,跟著本專案先搞懂PHP中大多敏感函式與各類特性,再逐漸增加難度

PHP程式碼審計命令執行

成功執行. 在具體分析細節之前,先說一下create_function()。 create_function返回一個字串的函式名, 這個函式名的格式是: "\000_lambda_" . count(anonymous_functions)++    我們來看看create_function的實現步驟:

PHP程式碼審計路——5.程式碼執行及一句話木馬總結

mixed eval ( string $code ) 把字串 code 作為PHP程式碼執行 bool assert ( mixed $assertion [, string $description ] ) PHP 5bool assert ( mixed $asse

PHP程式碼審計————1、PHP程式碼審計環境搭建

前言本系列部落格,主要講解PHP程式碼審計。從環境搭建到具體的實戰分析將會一步一步深入學習,希望可以對大家有所幫助。審計環境搭建作業系統:Window 7軟      件:phpstudy、VMware workstations14、seay 程式碼審計軟體、notepad+

PHP程式碼審計實戰MetInfo CMS

這次主要白盒審計MetInfo CMS的一個變數覆蓋漏洞。 先檢視\include\common.inc.php檔案,因為其中是通過$_request來獲取使用者請求的資訊: 這裡是遍歷初始化變數,很可能會出現變數覆蓋,判斷了key的第一個字元是不是“_”來避免覆蓋系統全

程式碼審計seacms v6.45 前臺Getshell 復現分析

1.環境: php5.5.38+apache+seacms v6.45 seacms目錄結構: │─admin //後臺管理目錄 │ │─coplugins //已停用目錄 │ │─ebak //帝國備份王資料備份 │ │─editor //編輯器 │ │─img //後臺靜態檔案 │ │

PHP程式碼審計01in_array()函式缺陷

#前言 從今天起,結合紅日安全寫的文章,開始學習程式碼審計,題目均來自**PHP SECURITY CALENDAR 2017**,講完這個題目,會再用一道有相同問題的CTF題來進行鞏固。下面開始分析。 #漏洞分析 下面我們看第一題,程式碼如下: ``` ``` 這一關考察的是任意檔案上傳漏洞,導致這個漏洞

PHP程式碼審計02filter_var()函式缺陷

#前言 根據紅日安全寫的文章,學習PHP程式碼審計審計的第二節內容,題目均來自**PHP SECURITY CALENDAR 2017**,講完這個題目,會有一道CTF題目來進行鞏固,外加一個例項來深入分析,想了解上一篇的內容,可以點選這裡:[PHP程式碼審計01之in_array()函式缺陷](https: