PHPvol1常見函數[轉載]

1.if(eregi(“hackerDJ”,$_GET[id])) { //eregi字符串對比

echo(“

not allowed!

”);

exit();

2.isset 判斷變量是否定義過

3.比較符

a==a==b 鬆散比較

=== 完全等於

= 大於等於

!= 如果類型轉換後aa不等於b,Ture

!== 不完全等於,如果aa不等於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])andisset(_GET['a']) and isset(_GET[‘b’])) {

if ($_GET[‘a’] != $_GET[‘b’])

if (md5(GET[a])===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(user = trim(_POST[user]);

pass=md5(trim(pass = md5(trim(_POST[pass]));

sql="selectuserfromctfwhereuser=".sql="select user from ctf where (user='".user."’) and (pw=’".$pass."’)";

echo '</br>'.$sql;

query=mysqlfetcharray(mysqlquery(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) { ?>

只需要覆蓋passpass、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方式獲得的變量導入到當前的符號表中.

然後判斷passpass 與thepassword_123兩個變量的內容是否相等.

但是, 由於extract()函數的不足之處, 導致這段代碼存在一個變量覆蓋漏洞.

只要我們這樣構造url

/?pass =&thepassword_123=

那麼, 我們可以發現, passpass 變量和thepassword_123變量的內容都會被設置成空字符串.這樣就使得兩個變量被覆蓋。

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);");//這裏涉及超全局變量的使用
}
?>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章