电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

php bugs代碼審計(jì)基礎(chǔ)詳解

瀏覽:177日期:2022-06-05 17:50:51
目錄
  • 變量覆蓋漏洞
  • 繞過過濾空白字符
  • 多重加密
  • WITH ROLLUP注入
  • erge截?cái)?/li>
  • strcmp比較字符串
  • sha()函數(shù)比較繞過

變量覆蓋漏洞

<?php$flag="xxx"; extract($_GET); if(isset($shiyan)) {     $content=trim(file_get_contents($flag));  //將讀取$flag內(nèi)容并去除左右空白后保存到$content    if($shiyan==$content)    { echo"ctf{xxx}";     }   else   {     echo"Oh.no";   }    }?>

重要點(diǎn)為$shiyan==$content只要滿足這個(gè)條件就可以獲取flag。

首先extract()函數(shù)的作用為從數(shù)組將變量導(dǎo)入到當(dāng)前符號(hào)表,也就是說我們?nèi)绻麡?gòu)造

xxx.com/index.php?$shiyan=1則會(huì)生成一個(gè)名字為$shiyan的變量,值為1。

然后通過isset函數(shù)來判斷剛生成的$shiyan變量是否為null,如果為null就進(jìn)入判斷。

$content變量則是通過file_get_contents函數(shù)和trim函數(shù)來讀取文件,但是此時(shí)它所讀取的文件$flag值為xxx,此時(shí)這個(gè)目錄是不存在的,所以它的值為空。

所以我們此時(shí)要做的就是將$shiyan的值變?yōu)榭占纯伞?/p>

所以構(gòu)造鏈接xxx.com/index.php?$shiyan=&flag=1即可獲得ctf{xxx}

繞過過濾空白字符

<?php$info = ""; $req = [];$flag="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";ini_set("display_error", false); //為一個(gè)配置選項(xiàng)設(shè)置值error_reporting(0); //關(guān)閉所有PHP錯(cuò)誤報(bào)告if(!isset($_GET["number"])){   header("hint:26966dc52e85af40f59b4fe73d8c323a.txt"); //HTTP頭顯示hint 26966dc52e85af40f59b4fe73d8c323a.txt   die("have a fun!!"); //die — 等同于 exit()}foreach([$_GET, $_POST] as $global_var) {  //foreach 語法結(jié)構(gòu)提供了遍歷數(shù)組的簡(jiǎn)單方式     foreach($global_var as $key => $value) { $value = trim($value);  //trim — 去除字符串首尾處的空白字符(或者其他字符)is_string($value) && $req[$key] = addslashes($value); // is_string — 檢測(cè)變量是否是字符串,addslashes — 使用反斜線引用字符串    } } function is_palindrome_number($number) {     $number = strval($number); //strval — 獲取變量的字符串值    $i = 0;     $j = strlen($number) - 1; //strlen — 獲取字符串長(zhǎng)度    while($i < $j) { if($number[$i] !== $number[$j]) {     return false; } $i++; $j--;     }     return true; } if(is_numeric($_REQUEST["number"])) //is_numeric — 檢測(cè)變量是否為數(shù)字或數(shù)字字符串 {   $info="sorry, you cann"t input a number!";}elseif($req["number"]!=strval(intval($req["number"]))) //intval — 獲取變量的整數(shù)值{     $info = "number must be equal to it"s integer!! ";  }else{     $value1 = intval($req["number"]);     $value2 = intval(strrev($req["number"]));       if($value1!=$value2){  $info="no, this is not a palindrome number!";     }     else     {  if(is_palindrome_number($req["number"])){      $info = "nice! {$value1} is a palindrome number!";   }  else  {     $info=$flag;  }     }}echo $info;

根據(jù)代碼判斷,它需要滿足多個(gè)條件才可以執(zhí)行$info=$flag;之后echo出來的才是flag。

if(is_numeric($_REQUEST["number"])) //is_numeric — 檢測(cè)變量是否為數(shù)字或數(shù)字字符串 {   $info="sorry, you cann"t input a number!";}

先來看看第一個(gè)條件,它要求number參數(shù)傳入的內(nèi)容不能為數(shù)字,否則返回sorry, you cann't input a number!

但是它的第二個(gè)要求為數(shù)字必須為整數(shù),否則輸出number must be equal to it's integer!!

elseif($req["number"]!=strval(intval($req["number"]))) //intval — 獲取變量的整數(shù)值{     $info = "number must be equal to it"s integer!! ";  } 

導(dǎo)致我們輸入字符串也會(huì)報(bào)錯(cuò)

這里我們用到%00來繞過is_numeric函數(shù)的判斷。

根據(jù)報(bào)錯(cuò),再來看看$value1,它是$req["number"]的整數(shù)值,$value2則為反轉(zhuǎn)之后的$req["number"]的整數(shù)值。

$value1 = intval($req["number"]);$value2 = intval(strrev($req["number"]));  if($value1!=$value2){  $info="no, this is not a palindrome number!";     }

所以第三步要滿足的條件為,它必須為回文數(shù)即從左往右和從右往左讀取都要相同的數(shù)值,所以我們構(gòu)造如下

以上三個(gè)條件都滿足后,接下來看看最后一個(gè)條件

  if(is_palindrome_number($req["number"])){      $info = "nice! {$value1} is a palindrome number!";   }  else  {     $info=$flag;  }

這里調(diào)用了is_palindrome_number()函數(shù),我們看看函數(shù)內(nèi)容

function is_palindrome_number($number) {     $number = strval($number); //strval — 獲取變量的字符串值    $i = 0;     $j = strlen($number) - 1; //strlen — 獲取字符串長(zhǎng)度    while($i < $j) { if($number[$i] !== $number[$j]) {     return false; } $i++; $j--;     }     return true; } 

可以看到這里函數(shù)的作用是判斷數(shù)字是否是對(duì)稱的,我們的要求是讓它執(zhí)行return false來執(zhí)行$info=$flag;所以這里想到的是在數(shù)字前加字符串+字符串+is_numeric中是被無視的,也就是說+100與100相等。

所以我們構(gòu)造%00%2b454即可

多重加密

<?php    include "common.php";    $requset = array_merge($_GET, $_POST, $_SESSION, $_COOKIE);    //把一個(gè)或多個(gè)數(shù)組合并為一個(gè)數(shù)組    class db    {public $where;function __wakeup(){    if(!empty($this->where))    {$this->select($this->where);    }}function select($where){    $sql = mysql_query("select * from user where ".$where);    //函數(shù)執(zhí)行一條 MySQL 查詢。    return @mysql_fetch_array($sql);    //從結(jié)果集中取得一行作為關(guān)聯(lián)數(shù)組,或數(shù)字?jǐn)?shù)組,或二者兼有返回根據(jù)從結(jié)果集取得的行生成的數(shù)組,如果沒有更多行則返回 false}    }    if(isset($requset["token"]))    //測(cè)試變量是否已經(jīng)配置。若變量已存在則返回 true 值。其它情形返回 false 值。    {$login = unserialize(gzuncompress(base64_decode($requset["token"])));//gzuncompress:進(jìn)行字符串壓縮//unserialize: 將已序列化的字符串還原回 PHP 的值$db = new db();$row = $db->select("user=\"".mysql_real_escape_string($login["user"])."\"");//mysql_real_escape_string() 函數(shù)轉(zhuǎn)義 SQL 語句中使用的字符串中的特殊字符。if($login["user"] === "ichunqiu"){    echo $flag;}else if($row["pass"] !== $login["pass"]){    echo "unserialize injection!!";}else{    echo "(╯‵□′)╯︵┴─┴ ";}    }else{header("Location: index.php?error=1");    }?> 

因題目中并沒有給出數(shù)據(jù)庫配置文件,所以直接看題,在題目中重點(diǎn)部分為

    if(isset($requset["token"]))    //測(cè)試變量是否已經(jīng)配置。若變量已存在則返回 true 值。其它情形返回 false 值。    {$login = unserialize(gzuncompress(base64_decode($requset["token"])));//gzuncompress:進(jìn)行字符串壓縮//unserialize: 將已序列化的字符串還原回 PHP 的值$db = new db();$row = $db->select("user=\"".mysql_real_escape_string($login["user"])."\"");//mysql_real_escape_string() 函數(shù)轉(zhuǎn)義 SQL 語句中使用的字符串中的特殊字符。if($login["user"] === "ichunqiu"){    echo $flag;}else if($row["pass"] !== $login["pass"]){    echo "unserialize injection!!";}else{    echo "(╯‵□′)╯︵┴─┴ ";}    }else{header("Location: index.php?error=1");    }

條件1為判斷是否存在token參數(shù),如果存在,那么就將token得值進(jìn)行反序列化和解壓縮后的值進(jìn)行base64解密。

解密完成后會(huì)帶入上面寫得db類中得select方法查詢。

接著就是需要注意得重點(diǎn),if($login['user'] === 'ichunqiu')即需要傳入的user值為ichunqiu

所以我們逆推出來需要做得就是先將user設(shè)定值為ichunqiu,隨后進(jìn)行base64加密得到值,但是我們剛才說到它在傳值過程中進(jìn)行了反序列話和解壓縮,所以我們也需要進(jìn)行壓縮和序列化,分別用

gzcompress來壓縮gzuncompress解壓縮。

serialize來序列化unserialize反序列化。

最終得到如下代碼,并得到token的值為eJxLtDK0qs60MrBOAuJaAB5uBBQ=,提交token即可echo $flag

<?php$arr = array(["user"] === "ichunqiu");$token = base64_encode(gzcompress(serialize($arr)));print_r($token);?>

WITH ROLLUP注入

<?phperror_reporting(0);if (!isset($_POST["uname"]) || !isset($_POST["pwd"])) {    echo "<form action="" method="post">"."<br/>";    echo "<input name="uname" type="text"/>"."<br/>";    echo "<input name="pwd" type="text"/>"."<br/>";    echo "<input type="submit" />"."<br/>";    echo "</form>"."<br/>";    echo "<!--source: source.txt-->"."<br/>";    die;}function AttackFilter($StrKey,$StrValue,$ArrReq){      if (is_array($StrValue)){//檢測(cè)變量是否是數(shù)組$StrValue=implode($StrValue);//返回由數(shù)組元素組合成的字符串    }    if (preg_match("/".$ArrReq."/is",$StrValue)==1){   //匹配成功一次后就會(huì)停止匹配print "水可載舟,亦可賽艇!";exit();    }}$filter = "and|select|from|where|union|join|sleep|benchmark|,|\(|\)";foreach($_POST as $key=>$value){ //遍歷數(shù)組    AttackFilter($key,$value,$filter);}$con = mysql_connect("XXXXXX","XXXXXX","XXXXXX");if (!$con){    die("Could not connect: " . mysql_error());}$db="XXXXXX";mysql_select_db($db, $con);//設(shè)置活動(dòng)的 MySQL 數(shù)據(jù)庫$sql="SELECT * FROM interest WHERE uname = "{$_POST["uname"]}"";$query = mysql_query($sql); //執(zhí)行一條 MySQL 查詢if (mysql_num_rows($query) == 1) { //返回結(jié)果集中行的數(shù)目    $key = mysql_fetch_array($query);//返回根據(jù)從結(jié)果集取得的行生成的數(shù)組,如果沒有更多行則返回 false    if($key["pwd"] == $_POST["pwd"]) {print "CTF{XXXXXX}";    }else{print "亦可賽艇!";    }}else{    print "一顆賽艇!";}mysql_close($con);?>

第四題我們先來看看flag輸出得條件

    if($key["pwd"] == $_POST["pwd"]) {print "CTF{XXXXXX}";    }else{print "亦可賽艇!";    }

要滿足post中提交得pwd與$key = mysql_fetch_array($query);數(shù)據(jù)庫中讀取到得pwd相等,所以考點(diǎn)在于注入。

但是在AttackFilter函數(shù)和$filter中已經(jīng)限制了sql注入得關(guān)鍵字,所以沒辦法直接進(jìn)行注入。

其實(shí)在報(bào)錯(cuò)得過程中已經(jīng)進(jìn)行了提示亦可賽艇!,諧音為因缺思汀也就是WITH ROLLUP繞過注入

WITH ROLLUP是對(duì)group by分組后得結(jié)果進(jìn)行進(jìn)一步得匯總,如果按照列名進(jìn)行分組,因?yàn)榱械脤傩圆煌詴?huì)生成一條值null得新數(shù)據(jù),如果查詢結(jié)果時(shí)單一得情況下會(huì)生成一條列為null得數(shù)據(jù)。

我們來看看演示,值直接進(jìn)行查詢是有結(jié)果得

使用group by語句分組查詢也是正常顯示

但是當(dāng)我們?cè)?code>group by語句后添加WITH ROLLUP,可以看到效果如下

但是我們只需要其中第二列得數(shù)據(jù),所以使用limit 1讀取1條數(shù)據(jù)并使用offset去除一行數(shù)據(jù)得到我們需要得第二行

pwd得值被設(shè)置為了null,所以此題我們可以通過提交admin' GROUP BY pwd WITH ROLLUP LIMIT 1 OFFSET 1-- -來達(dá)到$key['pwd'] == $_POST['pwd']得條件并獲取flag。

erge截?cái)?/h2>
<?php $flag = "flag";if (isset ($_GET["password"])) {  if (ereg ("^[a-zA-Z0-9]+$", $_GET["password"]) === FALSE)  {    echo "<p>You password must be alphanumeric</p>";  }  else if (strlen($_GET["password"]) < 8 && $_GET["password"] > 9999999)   {     if (strpos ($_GET["password"], "*-*") !== FALSE) //strpos — 查找字符串首次出現(xiàn)的位置      {      die("Flag: " . $flag);      }      else      {echo("<p>*-* have not been found</p>");        }      }     else      {echo "<p>Invalid password</p>";       }   } ?>

先來梳理流程 首先條件一用ereg函數(shù)來寫死get參數(shù)password得值必須是數(shù)字大小寫字母,否則輸出You password must be alphanumeric

第二個(gè)條件為strlen($_GET['password']) < 8 && $_GET['password'] > 9999999也就是必須長(zhǎng)度小于8但是值又要大于9999999。

所以我們需要用科學(xué)計(jì)數(shù)法來繞過這里得限制1e7為10得7次方10000000。

第三個(gè)條件為strpos ($_GET['password'], '*-*') !== FALSE在值中必須存在*-*如果滿足此條件,就沒辦法滿足條件一,所以這里可以采用%00截?cái)喾▉磉M(jìn)行繞過,因?yàn)?code>ereg函數(shù)遇到%00后就不會(huì)繼續(xù)進(jìn)行判斷

?password=1e7%00*-*即可滿足全部條件,執(zhí)行die('Flag: ' . $flag);來獲取flag

strcmp比較字符串

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

這題得考點(diǎn)在于strcmp函數(shù),它的作用在于兩個(gè)字符串相比較,如果兩者相等就會(huì)==0

此函數(shù)是用來處理字符串參數(shù)的,如果提交的值是數(shù)組的話會(huì)返回個(gè)null在判斷中使用的是==等值符,如果類型不相同的情況下會(huì)轉(zhuǎn)換為同類型進(jìn)行比較,所以null==0,執(zhí)行die('Flag: '.$flag);

所以我們提交一個(gè)數(shù)組類型的值即可?a[]=1

sha()函數(shù)比較繞過

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

這題的考點(diǎn)在于sha1($_GET['name']) === sha1($_GET['password'])

他這里使用的是===等同符,他要求兩邊值得類型相同,才會(huì)去比較值,否則會(huì)直接返回false

首先來看條件一$_GET['name'] == $_GET['password'] name要與password不相等才會(huì)執(zhí)行else if

但是else if又要求===,所以我們可以利用sha1函數(shù)不能處理數(shù)組得機(jī)制來繞過

?name[]=1&password[]=2既滿足了name與password不相等,也滿足了因sha1無法處理數(shù)組,導(dǎo)致返回值為false=false所以會(huì)執(zhí)行die('Flag: '.$flag);

到此這篇關(guān)于php bugs代碼審計(jì)基礎(chǔ)詳解的文章就介紹到這了,更多相關(guān)php bugs內(nèi)容請(qǐng)搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

標(biāo)簽: PHP
主站蜘蛛池模板: 防腐木批发价格_深圳_惠州_东莞防腐木厂家_森源(深圳)防腐木有限公司 | 重庆波纹管|重庆钢带管|重庆塑钢管|重庆联进管道有限公司 | 大学食堂装修设计_公司餐厅效果图_工厂食堂改造_迈普装饰 | 齿轮减速电机一体机_蜗轮蜗杆减速马达-德国BOSERL齿轮减速机带电机生产厂家 | 对照品_中药对照品_标准品_对照药材_「格利普」高纯中药标准品厂家-成都格利普生物科技有限公司 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 京马网,京马建站,网站定制,营销型网站建设,东莞建站,东莞网站建设-首页-京马网 | 南汇8424西瓜_南汇玉菇甜瓜-南汇水蜜桃价格 | 3dmax渲染-效果图渲染-影视动画渲染-北京快渲科技有限公司 | 塑料瓶罐_食品塑料瓶_保健品塑料瓶_调味品塑料瓶–东莞市富慷塑料制品有限公司 | 叉车电池-叉车电瓶-叉车蓄电池-铅酸蓄电池-电动叉车蓄电池生产厂家 | 广州食堂承包_广州团餐配送_广州堂食餐饮服务公司 - 旺记餐饮 | 中药超微粉碎机(中药细胞级微粉碎)-百科 | 北京宣传片拍摄_产品宣传片拍摄_宣传片制作公司-现像传媒 | 一航网络-软件测评官网| 老房子翻新装修,旧房墙面翻新,房屋防水补漏,厨房卫生间改造,室内装潢装修公司 - 一修房屋快修官网 | 聚氨酯催化剂K15,延迟催化剂SA-1,叔胺延迟催化剂,DBU,二甲基哌嗪,催化剂TMR-2,-聚氨酯催化剂生产厂家 | 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 运动木地板厂家_体育木地板安装_篮球木地板选购_实木运动地板价格 | 氢氧化钾厂家直销批发-济南金昊化工有限公司 | 防潮防水通风密闭门源头实力厂家 - 北京酷思帝克门窗 | bng防爆挠性连接管-定做金属防爆挠性管-依客思防爆科技 | 河南包装袋厂家_河南真空袋批发价格_河南服装袋定制-恒源达包装制品 | 冻干机(冷冻干燥机)_小型|实验型|食品真空冷冻干燥机-松源 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | COD分析仪|氨氮分析仪|总磷分析仪|总氮分析仪-圣湖Greatlake | 微型气象仪_气象传感器_防爆气象传感器-天合传感器大全 | 包装机_厂家_价格-山东包装机有限公司 | 大白菜官网,大白菜winpe,大白菜U盘装系统, u盘启动盘制作工具 | 真空冷冻干燥机_国产冻干机_冷冻干燥机_北京四环冻干 | 27PR跨境电商导航 | 专注外贸跨境电商| 金联宇电缆|广东金联宇电缆厂家_广东金联宇电缆实业有限公司 | 标准件-非标紧固件-不锈钢螺栓-非标不锈钢螺丝-非标螺母厂家-三角牙锁紧自攻-南京宝宇标准件有限公司 | 缓蚀除垢剂_循环水阻垢剂_反渗透锅炉阻垢剂_有机硫化物-郑州威大水处理材料有限公司 | 定量包装机,颗粒定量包装机,粉剂定量包装机,背封颗粒包装机,定量灌装机-上海铸衡电子科技有限公司 | 生物除臭剂-除味剂-植物-污水除臭剂厂家-携葵环保有限公司 | 青岛球场围网,青岛车间隔离网,青岛机器人围栏,青岛水源地围网,青岛围网,青岛隔离栅-青岛晟腾金属制品有限公司 | 成都热收缩包装机_袖口式膜包机_高速塑封机价格_全自动封切机器_大型套膜机厂家 | 冷轧机|两肋冷轧机|扁钢冷轧机|倒立式拉丝机|钢筋拔丝机|收线机-巩义市华瑞重工机械制造有限公司 | 超声波流量计_流量标准装置生产厂家 _河南盛天精密测控 | 上海logo设计 | 吸污车_吸粪车_抽粪车_电动三轮吸粪车_真空吸污车_高压清洗吸污车-远大汽车制造有限公司 |