1. 程式人生 > >實驗吧writeup

實驗吧writeup

語法 解析錯誤 string -- 有意 AD 設置 AR 字符串

後臺登錄

1、看源碼
有這樣一段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 ‘密碼錯誤!‘;
} -->

其中關鍵是
$sql = "SELECT * FROM admin WHERE username = ‘admin‘ and password = ‘".md5($password,true)."‘";

考察md5的這個函數

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


== :  比較運算符號 忽略類型,只要值相同就可以,類型不同時也可以
===: 恒等計算符 , 同時檢查表達式的值與類型。

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後會自動進行一次編碼

實驗吧writeup