- 進(jìn)入頁面安皱,發(fā)現(xiàn)一個頁面颓帝,查看源代碼沒有注釋的提示。
- 進(jìn)入登陸發(fā)現(xiàn)是md5前幾位截取妓布。用我的submd5.py 找出可以用的驗(yàn)證碼
- 在burpsuite里面用萬能密碼嘗試登陸一次。 1‘ or 1=1 #
- 發(fā)現(xiàn)成功登陸后會跳轉(zhuǎn)一個頁面
<script>alert("Welcome 1' or 1=1 #!");window.location.href="./action.php?action=file";
</script>substr(md5(captcha), 0, 6)=5250e1<div class="box"><b>Captcha: </b></div>
- 先不急著進(jìn)入這個頁面先看看注入能達(dá)到什么成功宋梧。
- 注入 order by 3 4 有區(qū)別匣沼。 注入到union select 1,2,3 就怎么也成功不了∥媪洌看來有一些過濾释涛。
- 不費(fèi)勁了,轉(zhuǎn)去上面的跳轉(zhuǎn)頁面看看倦沧。
- 發(fā)現(xiàn)能下載三個文件唇撬。
- 下載后除了a.php有個 echo "Do what you want to do, web dog, flag is in the web root dir"; 提示外其他兩個沒用。
- root這個坑我還是以為管理員用戶的目錄呢刀脏。原來是網(wǎng)站根目錄局荚。
- 怎么進(jìn)入根目錄呢,我們觀察我們下載連接的時候的url
GET /Challenges/file/download.php?f=a.php HTTP/1.1
- f= 指定文件就行了愈污,可能沒有過濾。既然是根目錄試試/var/www/html/flag.php,就返回一個200 ok 這里我又踩了個坑轮傍, 應(yīng)該是/var/www/html/Challenges/flag.php
- 得到一個php文件暂雹。
- 看一下
<?php
$f = $_POST['flag'];
$f = str_replace(array('`', '$', '*', '#', ':', '\\', '"', "'", '(', ')', '.', '>'), '', $f);
if((strlen($f) > 13) || (false !== stripos($f, 'return')))
{
die('wowwwwwwwwwwwwwwwwwwwwwwwww');
}
try
{
eval("\$spaceone = $f");
}
catch (Exception $e)
{
return false;
}
if ($spaceone === 'flag'){
echo file_get_contents("helloctf.php");
}
?>
- 所以往Challenges/flag.php 用post方式傳一個flag=flag;就得到flag了。
為什么呢很奇怪创夜。 - 測試這個方法的可行性杭跪。
$f='flag;';
eval("\$spaceone = $f");
echo $spaceone;
$f1='flag';
eval("\$spaceone = $f1");
echo $spaceone;
$f2 = 'flag;';
\$spaceone=$f;
echo $spaceone;
- $f會輸出flag $f1會輸出null $f2會報錯
- 這并不能說明什么,因?yàn)?img class="math-inline" src="https://math.jianshu.com/math?formula=f1%2C" alt="f1," mathimg="1">f沒什么本質(zhì)區(qū)別。后來我用assert測試發(fā)現(xiàn)$f1也可行涧尿。
- 思考assert和eval的區(qū)別--assert會執(zhí)行一個字符串系奉,而eval需要執(zhí)行一個語句。即assert('phpinfo();') 加不加;都行姑廉。 而eval必須的eval('phpinfo();')才行. 所以flag后面加個;
eval會認(rèn)為其是個語句缺亮。即認(rèn)為是語句的時候,\就被當(dāng)成了一個轉(zhuǎn)義字符桥言。 -
第二種解法
flag= 以下
<<<s
flag
s;
四個換行是必須的萌踱。還必須換成URL編碼。号阿。并鸵。。