閱讀后我們發(fā)現(xiàn)要找到flag就要找到和‘QNKCDZO’md5加密后相同的字符串。顯然“碰撞”找對應(yīng)字符串是幾乎不可能的,那么推測應(yīng)該是利用PHP語言的弱類型的特性:
1)將QNKCDZO進(jìn)行MD5加密,密文為0e830400451993494058024219903391,發(fā)現(xiàn)密文為0e開頭,PHP在進(jìn)行比較運(yùn)算時(shí),如果遇到了0e\d+這種字符串,就會(huì)將這種字符串解析為科學(xué)計(jì)數(shù)法。
2)因?yàn)?exx都等于0,所以讓兩者相等我們只需再找到一個(gè)MD5加密后開頭為0e的字符串即可
3)相關(guān)字符串:
md5('s878926199a')=0e545993274517709034328855841020
md5('s155964671a')=0e342768416822451524974117254469
//php中“==”和“===”的區(qū)別:“==”只比較數(shù)據(jù)的值是否相等,而“===”比較的是數(shù)據(jù)類型和值是否相等,
比如整數(shù)0和浮點(diǎn)數(shù)0.0
用==比較返回TRUE
用===比較返回FLASE
文件包含:
http://4.chinalover.sinaapp.com/web7/index.php
了解php://filter 元封裝器
文件讀取操作:
include “test.php”php文件包含,在執(zhí)行流中插入寫在其他文件中的有用的代碼。讀取的時(shí)候也是數(shù)據(jù)流形式,因此可以使用php://filter進(jìn)行過濾,返回值為0,1。
readfile(“test.php”)是將文件以數(shù)據(jù)流的形式讀取過來,并不會(huì)執(zhí)行,但會(huì)在前臺(tái)瀏覽器上進(jìn)行解析。返回值是字節(jié)數(shù)多少。
file_get_contents(“test.php”)返回值為文本內(nèi)容
典型的文件包含漏洞我們可以通過構(gòu)造含有漏洞的語句,查看想要看的代碼
構(gòu)造語句:file=php://filter/read=convert.base64-encode/resource=index.php
1.php://filter/可用于處理打開的數(shù)據(jù)流,起到過濾作用。如果源文件為.php則很有可能在前臺(tái)顯示不出來。
2.此時(shí)我們采用的方法是,先讓文件轉(zhuǎn)化為base64格式(convert.base64-encode)然后再輸出,這樣不論是什么格式的文件都可以在前臺(tái)輸出。
3.再次解碼就可得到源代碼
了解php://filter詳細(xì)內(nèi)容:http://php.net/manual/zh/wrappers.php.php
ereg函數(shù):
ereg()函數(shù)用指定的模式搜索一個(gè)字符串中指定的字符串,如果匹配成功返回true,否則,則返回false。搜索字母的字符是大小寫敏感的。//正則表達(dá)式
stripos函數(shù):strpos('i love php','php'),匹配‘i love php’中是否有"php",有則返回字符所在位置
題目源碼如下:
if?(isset?($_GET['nctf']))?{
if?(@ereg?("^[1-9]+$",?$_GET['nctf'])?===?FALSE)
echo?'必須輸入數(shù)字才行';//利用ereg函數(shù)對輸入的字符進(jìn)行匹配,若是數(shù)字返回真,否則返回FALSE,此時(shí)可以用%00進(jìn)行對字符截?cái)啵?00截?cái)嗉坝龅?00則默認(rèn)為字符串的結(jié)束
else?if?(strpos?($_GET['nctf'],?'#biubiubiu')?!==?FALSE)
die('Flag:?'.$flag);
else
echo?'騷年,繼續(xù)努力吧啊~';
}
?>
一、此時(shí)可以輸入1%00%23biubiubiu,ereg?("^[1-9]+$",?$_GET['nctf'])匹配出1,而strpos匹配到原字符,可輸出flag
二、輸入a[]=1,此時(shí)為數(shù)組不符合ereg匹配的類型,繞過了ereg函數(shù),此時(shí)strpos獲得的是“Array”,也繞過了strpos函數(shù)
變量覆蓋:
源碼:
extract($_POST);
if?($pass==$thepassword_123)?{?>
很明顯,當(dāng)$pass和$thepassword_123的值相等時(shí),輸出flag,此時(shí)抓包修改post的值就可以得到flag
//extract函數(shù),extract() 函數(shù)從數(shù)組中將變量導(dǎo)入到當(dāng)前的符號(hào)表
例如
$a?=?"Original";
$my_array?=?array("a"?=>?"Cat","b"?=>?"Dog",?"c"?=>?"Horse");
extract($my_array);
echo?"\$a?=?$a;?\$b?=?$b;?\$c?=?$c";
?>
輸出結(jié)果為:$a = Cat; $b = Dog; $c = Horse
pass check:
$pass=@$_POST['pass'];
$pass1=***********;//被隱藏起來的密碼
if(isset($pass))
{
if(@!strcmp($pass,$pass1)){
echo "flag:nctf{*}";
}else{
echo "the pass is wrong!";
}
}else{
echo "please input pass!";
}
?>
tip:strcmp(array,string)=null=0
strcmp為字符串比較函數(shù),s=trcmp(string1,string2),當(dāng)string1與string2相等時(shí)s=0,string1
sql注入4:
源碼:
#GOAL:?login?as?admin,then?get?the?flag;
error_reporting(0);
require?'db.inc.php';
function?clean($str){
if(get_magic_quotes_gpc()){
$str=stripslashes($str);
}
return?htmlentities($str,?ENT_QUOTES);
}
$username?=?@clean((string)$_GET['username']);
$password?=?@clean((string)$_GET['password']);
$query='SELECT?*?FROM?users?WHERE?name=\''.$username.'\'?AND?pass=\''.$password.'\';';
$result=mysql_query($query);
if(!$result?||?mysql_num_rows($result)?<?1){
die('Invalid?password!');
}
echo?$flag;
-->
函數(shù)說明:
magic_quotes_gpc()開啟時(shí)為獲得的字符中的單引號(hào)等字符進(jìn)行轉(zhuǎn)義,get_magic_quotes_gpc()為檢查magic_quotes_gpc()是否開啟
stripslashes函數(shù)為字符串中刪除由addslashes函數(shù)添加的反斜杠
htmlentities()函數(shù): htmlentities() 函數(shù)把字符轉(zhuǎn)換為 HTML 實(shí)體
htmlentities($str,?ENT_COMPAT);?//?只轉(zhuǎn)換雙引號(hào)
htmlentities($str,?ENT_QUOTES);?//?轉(zhuǎn)換雙引號(hào)和單引號(hào)
htmlentities($str,?ENT_NOQUOTES);?//?不轉(zhuǎn)換任何引號(hào)
即htmlentities以編碼格式將單引號(hào)或雙引號(hào)編碼后再解碼到html文本中(我是這樣理解的:))
在mysql查詢語句中轉(zhuǎn)義字符不參與閉合
當(dāng)輸入admin=\&password=or 1=1#'的時(shí)候源碼變?yōu)?/p>
select * from users where name=\''\'\'ANDpass=\''or 1=1#''\',所以第二個(gè)引號(hào)與第六個(gè)引號(hào)閉合,繞過檢測