實驗吧writeup

後臺登陸php

一、看源碼
有這樣一段php代碼
<!-- $password=$_POST['password'];
 $sql = "SELECT * FROM admin WHERE username = 'admin' and password = '".md5($password,true)."'";
 $result=mysqli_query($link,$sql);
  if(mysqli_num_rows($result)>0){
   echo 'flag is :'.$flag;
  }
  else{
   echo '密碼錯誤!';
  } -->
mysql

其中關鍵是
$sql = "SELECT * FROM admin WHERE username = 'admin' and password = '".md5($password,true)."'";正則表達式

考察md5的這個函數sql

md5(string, raw)
raw 可選,默認爲false
true:返回16字符2進制格式
false:返回32字符16進制格式
簡單來講就是 true將16進制的md5轉化爲字符了,
那麼若是某一字符串的md5剛好可以產生如’or ’之類的注入語句,就能夠進行注入了.數組

難點就在如何尋找這樣的字符串,我上網查函數的時候碰巧找到的
字符串:ffifdyop
md5後,276f722736c95d99e921722cf9ed621c
再轉成字符串: 'or'6<trash>
就能夠了安全

 


FALSE函數

函數isset(): 檢測變量是否設置
只能用於變量,傳遞任何其它參數都將形成解析錯誤。若想檢測常量是否已設置,可以使用 defined() 函數
 格式:  isset ( mixed var [, mixed var [, ...]] )
    若變量不存在或存在但其值爲NULL則返回 FALSE
    若變量存在且值不爲NULL,則返回 TURE 編碼

    同時檢查多個變量時,每一個單項都符合上一條要求時才返回 TRUE,不然結果爲 FALSE加密

 
== :  比較運算符號  忽略類型,只要值相同就能夠,類型不一樣時也能夠
===:  恆等計算符 , 同時檢查表達式的值與類型。url

die()函數  :  中止程序運行,輸出內容
sha1()函數: 計算字符串的 SHA-1 散列。默認的傳入參數類型是字符串型
語法:sha1(string,raw)
string  必需。規定要計算的字符串。
raw  可選。規定十六進制或二進制輸出格式:

        TRUE - 原始 20 字符二進制格式
        FALSE - 默認。40 字符十六進制數

閱讀代碼可知
登陸成功條件: (1)傳入name,password的值(2)name和password的值不能相等(3)  name和password的sha1加密散列值相等

而後不會了。。搜的
?name[]=a&password[]=b

 


Form

PIN碼(PIN1),全稱Personal Identification Number.就是SIM卡的我的識別密碼。
不知道這句話在這裏什麼意思

查看源碼,發現有一行type 是hidden 就頗有意思,name="showsource" value="0"
嘗試把0改爲1,就出現了php
這個比較好理解

 

Once More

題目提示頗有用
hint:ereg()函數有漏洞哩;從小老師就說要用科學的方法來算數。
提示咱們要用erge()函數的漏洞,並留意科學計數法
看源碼

ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE

語法

    int ereg(string pattern, string originalstring, [array regs]);

定義和用途

ereg()函數用指定的模式搜索一個字符串中指定的字符串,若是匹配成功返回true,不然,則返回false。搜索字母的字符是大小寫敏感的。

可選的輸入參數規則包含一個數組的全部匹配表達式,他們被正則表達式的括號分組。
Return Value

若是匹配成功返回true,不然,則返回false

這裏表示輸入的password必須是大小寫字母和數字


strpos ($_GET['password'], '*-*') !== FALSE


定義和用法

strpos() 函數查找字符串在另外一字符串中第一次出現的位置。

註釋:strpos() 函數對大小寫敏感。

註釋:該函數是二進制安全的。
相關函數:

    stripos() - 查找字符串在另外一字符串中第一次出現的位置(不區分大小寫)
    strripos() - 查找字符串在另外一字符串中最後一次出現的位置(不區分大小寫)
    strrpos() - 查找字符串在另外一字符串中最後一次出現的位置(區分大小寫)

ereg函數漏洞
ereg()函數存在NULL截斷漏洞,致使正則過濾被繞過,因此能夠用%00來截斷正則匹配

用科學記數法構造:1e8%00*-*
注意URL編碼問題

 

PHP大法

語法
    int eregi(string pattern, string string, [array regs]);
定義和用法
eregi()函數在一個字符串搜索指定的模式的字符串。搜索不區分大小寫。Eregi()能夠特別有用的檢查有效性字符串,如密碼。 
可選的輸入參數規則包含一個數組的全部匹配表達式,他們被正則表達式的括號分組。
返回值
若是匹配成功返回true,不然,則返回false

注意輸入url後會自動進行一次編碼

相關文章
相關標籤/搜索