一、弱類型比較問題
原則:
1.字符串和數字比較,字符串回被轉換成數字。
"admin" ==0(true)
admin被轉換成數字,由于admin是字符串,轉換失敗,變成0
int(admin)=0,所以比較結果是ture
2.混合字符串轉換成數字,看字符串的第一個
“1admin” == 1 ‘’2admin“ == 2?
3.字符串開頭以xex開頭,x代表數字。會被轉換成科學計數法
1e9? => 1x10^9
例題一
GIVE ME THE MONEY!!!
<?php
include "flag.php";
highlight_file(__FILE__);
if (isset($_GET['money'])) {
$money=$_GET['money'];
if(strlen($money)<=4&&$money>time()&&!is_array($money))
{
echo $flag;
}
else echo "Wrong Answer!";
}
else echo "Wrong Answer!";
?>
使用到第三個原則,輸入參數為四個字節(jié),含有字母e分隔的字符串,設置數值比較大,就可以大過time()時間戳
例題二,經典的0e繞過MD5
<!DOCTYPE html>
<!--html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
$flag="ctf{YOU_4re_DO1ng_GREAT!}";
if (isset($_GET['a'])&&isset($_GET['b'])) {
$a=$_GET['a'];
$b=$_GET['b'];
if($a==$b)
{
echo "<center>Wrong Answer!</center>";
}
else {
if(md5($a)==md5($b))
{
echo "<center>".$flag."</center>";
}
else echo "<center>Wrong Answer!</center>";
}
}
else echo "NONONO";
?>
</body>
</html-->
題目要求輸入的兩個參數a、b滿足條件1:a!=b同時滿足條件條件2:MD5(a)==MD5(b)
MD5加密的特點是,輸入的明文不同,輸出的結果必然不同
為了同時實現條件1和條件2,這種極端環(huán)境下就要用到弱類型比較問題的三個原則
分析MD5加密,它輸出的格式是16進制格式的(輸出的元素只有0-9和a-f)
在a-f范圍內有個特殊的字符e存在 ,所以用到三原則中的第三個原則
等號比較的兩邊有xex格式的,都當作科學計數法形式來比較
?輸入兩個0e開頭不相同的字符串,就可以同時滿足兩個條件
二、數組類型參數繞過
- 許多函數的參數輸入并非數組
- 強行輸入數組會返回特殊結果
傳入參數為數組類型,函數返回結果為NULL
例題
?輸入參數為三個不同的數組
md5($v1)==md5($v2)? ?=>null==null
strcmp()函數比較兩字符串是否相同,相同返回0,不相同返回1
v3強行輸入數組形式,函數返回值為null,加!變?yōu)閠ure
通常出現strcmp()函數都使用數組繞過,還有就是針對字符串操作的函數
三、傳參允許是空值,并實現繞過
<?php
include("extract_flag.php");
extract($_GET);
if(isset($aurora))
{
$content=trim(file_get_contents($flag));
if($aurora==$content)
{
echo $flag;
}
else { echo'Oh.no'; } }?>
- ?extract函數 :講傳入的數組,轉換為變量名和變量值的聲明,例如輸入的get參數是a=1&b=2經過該函數作用了,就多了兩個變量$a=1,$b=2。作用類似于n個$_GET(a)語句
- file get contents():傳入參數為文件名,函數將傳入文件的內容讀取出來
- trim():去除字符串首尾的空格
本題是在考驗我們是否已經知道了服務器上的某個文件的內容,就是參數aurora值傳已知文件的內容,$flag傳文件名,就能得到flag
但是問題在于不知道某個文件的內容
解決辦法是傳空值繞過,傳空值不是沒傳值isset()是可以滿足的
aurora&flag
四、%00繞過
php底層的解析器是由c語言實現的,在c語言表達字符串的終結是'\0',在php中是‘%00’
某些函數不過沒有對‘%00’進行特殊處理,就存在著可能繞過的空間
ereg就是這樣的函數,當輸入123%00到ereg函數中,遇到%00就認為字符串終結,不再判斷直接符合條件,返回ture
<?php
include("strpos_flag.php");
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';}?>
- strpos():實現字符串的字符查找是否存在
- ereg():正則表達式的匹配,
ereg
?(
"^[a-zA-Z0-9]+$"
,?
$_GET
[
'password'
]只允許包含【】內的字符
獲取后端源代碼的方法?
1.后端源碼會以注釋形式展示在前端源代碼中
- 右鍵查看前端頁面源代碼
- 地址欄中后跟/index.php~,會自動下載頁面源碼
2.由于電腦或vim編輯器非正常退出,會保留交換文件,后端源碼就保存在交換文件中
例題:
?題目提示說電腦會自動關機,電腦自動關機說明文本編輯器肯定會非正常退出,就會留下交換文件
在地址欄中后跟/.index.php.swp
就會自動下載交換文件文章來源:http://www.zghlxwxcb.cn/news/detail-675270.html
?文件內的內容就包含后端源代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-675270.html
到了這里,關于php 系列題目,包含查看后端源代碼的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!