標籤:重複 val die index.php source url 情況 檔案中 有一個
1.if(eregi("hackerDJ",$_GET[id])) { //eregi字串對比
echo("<p>not allowed!</p>");
exit();
2.isset 判斷變數是否定義過
3.比較符
$a==$b 鬆散比較
=== 完全等於
= 大於等於
!= 如果類型轉換後$a不等於$b,Ture
!== 不完全等於,如果$a不等於$b或者它們類型不同,Ture
當php進行一些數學計算的時候,當有一個對比參數是整數的時候,會把另外一個參數強制轉換為整數。
1 var_dump(0 == ‘0‘); // true
2 var_dump(0 == ‘abcdefg‘); // true
3 var_dump(0 === ‘abcdefg‘); // false
4 var_dump(1 == ‘1abcdef‘); // true
* bool類型的true跟任一字元串可以弱類型相等
在某些情況下,PHP會把類數值資料(如含有數位字串等)轉換成數值處理,== 運算子就是其中之一。在使用 == 運算子對兩個字串進行鬆散比較時,PHP會把類數值的字串轉換為數值進行比較,如果參數是字串,則返回字串中第一個不是數位字元之前的數字串所代表的整數值。比如: ‘3‘ == ‘3ascasd‘結果為true。
4.eval可以直接執行php代碼
5.intval 將變數轉成整數類型
6.ereg()函數用指定的模式搜尋一個字串中指定的字串,如果匹配成功返回true,否則,則返回false。搜尋字母的字元是大小寫敏感的。
int ereg(string pattern, string originalstring, [array regs]);
例,$email_id = "[email protected]";
$retval = ereg("(\.)(com$)", $email_id);
ereg()限制password的格式,只能是數字或者字母。但ereg()函數存在NULL截斷漏洞,可以使用%00繞過驗證。
這裡ereg有兩個漏洞:
①%00截斷及遇到%00則預設為字串的結束
②當ntf為數組時它的傳回值不是FALSE
7.strpos — 尋找字串首次出現的位置:
例,$mystring = ‘abc‘;
$findme = ‘a‘;
$pos = strpos($mystring, $findme);
8.$_GET可以接受數組但MD5
md5()不能處理數組結構的資料
利用此漏洞構造index.php?a[]=1&b[]=2
構造?a[]=1&b[]=2這樣md5函數無法處理數組返回false完成匹配得到flag
例,
if (isset($_GET[‘a‘]) and isset($_GET[‘b‘])) {
if ($_GET[‘a‘] != $_GET[‘b‘])
if (md5($_GET[‘a‘]) === md5($_GET[‘b‘]))
die(‘Flag: ‘.$flag);
else
print ‘Wrong.‘;
}
9.<?php
if($_POST[user] && $_POST[pass]) {
mysql_connect(SAE_MYSQL_HOST_M . ‘:‘ . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$user = trim($_POST[user]);
$pass = md5(trim($_POST[pass]));
$sql="select user from ctf where (user=‘".$user."‘) and (pw=‘".$pass."‘)";
echo ‘</br>‘.$sql;
$query = mysql_fetch_array(mysql_query($sql));
if($query[user]=="admin") {
echo "<p>Logged in! flag:******************** </p>";
}
if($query[user] != "admin") {
echo("<p>You are not admin!</p>");
}
}
echo $query[user];
?>
看見括弧了沒,我一直沒看見··········
最簡單的注入 和password無關
user=admin ‘)# //注意括弧要閉合不然報錯 我就是被坑的。
10.PHP對於這個@符號,之前很少在意,只知道它是錯誤屏蔽的符號
11.一般形式:strcmp(字串1,字串2)
說明:
當s1<s2時,返回為負數 注意不是-1 true
當s1==s2時,傳回值= 0 false
當s1>s2時,返回正數 注意不是1 true
11.strlen 判斷字串長度
例,else if (strlen($_GET[‘password‘]) < 8 && $_GET[‘password‘] > 9999999)
科學記號標記法,由於要使密碼長度小於8或值大於9999999,可以使用1e8或1e9滿足條件。
12.檔案包含漏洞
php://filter 是一種元封裝器, 設計用於資料流開啟時的篩選過濾應用。
同時我也藉此機會學到了檔案讀取的相關知識。
include “test.php”php檔案包含,在執行流中插入寫在其他檔案中的有用的代碼。讀取的時候也是資料流形式,因此可以使用php://filter進行過濾,傳回值為0,1。
readfile(“test.php”)是將檔案以資料流的形式讀取過來,並不會執行,但會在前台瀏覽器上進行解析。傳回值是位元組數多少。
file_get_contents(“test.php”)傳回值為常值內容
此題運用的就是關於資料流過濾的檔案包含,我們一般在進行檔案包含的時候都這麼寫include “test.php”獲得的就是test.php直接解析出來。但如果運用readfile(“test.php”) 就不進行解析,導致無法在瀏覽器前台進行顯示。那麼問題來了看題
簡單的重複一下他的意思
註解:
1.php://filter/可用於處理開啟的資料流,起到過濾作用。如果源檔案為.php則很有可能在前台顯示不出來。
2.此時我們採用的方法是,先讓檔案轉化為base64格式(convert.base64-encode)然後再輸出,這樣不論是什麼格式的檔案都可以在前台輸出。
3.再次解碼就可得到原始碼,怎麼樣是不是很神奇啊!
例http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
13.extract 變數覆蓋
總的來說是extract() 函數從數組中將變數匯入到當前的符號表,典型的變數覆蓋。
例,
<?php if ($_SERVER["REQUEST_METHOD"] == "POST") { ?>
<?php
extract($_POST);
if ($pass == $thepassword_123) { ?>
<div class="alert alert-success">
<code><?php echo $theflag; ?></code>
</div>
<?php } ?>
<?php } ?>
if ($pass == $thepassword_123) { ?>
只需要覆蓋$pass、$thepassword_123這兩個變數使他們相等即可。
14.php上傳截斷
15.set_time_limit(0);
括弧裡邊的數字是執行時間,如果為零說明永久執行直到程式結束,如果為大於零的數字,則不管程式是否執行完成,到了設定的秒數,程式結束。
16.PHP變數覆蓋
extract() 函數從數組中將變數匯入到當前的符號表。
該函數使用數組鍵名作為變數名,使用數組索引值作為變數值。針對數組中的每個元素,將在當前符號表中建立對應的一個變數。
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") { ?>
extract($_POST);
if ($pass == $thepassword_123) {
echo $theflag;
}
?>
在第三行, 運用了extract()函數, 將POST方式獲得的變數匯入到當前的符號表中.
然後判斷$pass 與$thepassword_123兩個變數的內容是否相等.
但是, 由於extract()函數的不足之處, 導致這段代碼存在一個變數覆蓋漏洞.
只要我們這樣構造url
/?pass =&thepassword_123=
那麼, 我們可以發現, $pass 變數和$thepassword_123變數的內容都會被設定成Null 字元串.這樣就使得兩個變數被覆蓋。
17.PHP超全域變數
$GLOBALS — 引用全域範圍中可用的全部變數
$GLOBALS 這種全域變數用於在 PHP 指令碼中的任意位置訪問全域變數(從函數或方法中均可)。
PHP 在名為 $GLOBALS[index] 的數組中儲存了所有全域變數。變數的名字就是數組的鍵。
例,
<?php
error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET[‘args‘])){
$args = $_GET[‘args‘];
if(!preg_match("/^\w+$/",$args)){
die("args error!");
}
eval("var_dump($$args);");//這裡涉及超全域變數的使用
}
?>
構造特殊url:http://120.24.86.145:8004/index1.php?args=GLOBALS
CTF中遇到的php