PACTF No.2 记录自己的First Blood.
1. First Blood of Web:
题目:
http://114.115.170.172:10400/
看到这个其实就想到怎样用所谓的“Pixel 2 XL手机”, 比赛题肯定不会让你去临时找个真的这种手机才行,但Chrome浏览器有个手机调试的功能,直接上:
打开F12.选择手机调试,选择“Pixel 2 XL”:
根据提示,修改请求方式为:LGET, 添加HTTP请求头部:Referer:pixel
Response里就有了flag! W0nD3rFul_fuTnr4
补全提交:PACTF{W0nD3rFul_fuTnr4}
哈哈,我的First Blood就这样生成了~~~~~
2. Second Blood Of Web:
http://114.115.170.172:10010/
刚开始还用http://114.115.170.172:10010/index.php?/a=http://www.baidu.com(以为是SSRF)
但弄了好久也没啥用。
到了晚上,扔扫描器扫了下:
看源码可以更清楚:
| |
| | |
| | |
| | 正确的的道路!平安!碰碰碰!
";; |
| | } |
| | |
| | $a2 = @file_get_contents($a,'r'); |
| | |
| | if($a2=="12345") |
| | { |
| | echo "离flag又近了一步!"; |
| | $_SESSION['level1'] = 'go'; |
| | header('Location: index.php'); |
| | } |
| | else |
| | { |
| | print " |
| | Tips: 12345,no CRLF。 |
| |
"; |
| | } |
| | }else{ |
| | |
| | |
| | if(!($_POST['b']) and !($_POST['c'])) |
| | { |
| | echo " |
| | 要通过这一关需要POST参数b和c! |
| | "; |
| | die(); |
| | } |
| | |
| | $b = $_POST['b']; |
| | $c = $_POST['c']; |
| | |
| | if (!(is_numeric($b))) { |
| | echo "
b 出错!
"; |
| | die(); |
| | } |
| | |
| | if (!(ctype_upper($c)) || (strlen($c) >= 5)) { |
| | echo "
c 出错!
"; |
| | die(); |
| | } |
| | |
| | echo ""; |
| | |
| | $hack = $_GET[h]; |
| | $rep = $_GET[r]; |
| | |
| | if ((strlen($hack) >= 6) || (strlen($rep) >= 6)) { |
| | echo "
h OR r 出错!
"; |
| | die(); |
| | } |
| | |
| | $str1 = hash('md5', $b, false); |
| | $str2 = strtr(hash('md5', $c, false), $hack, $rep); |
| | |
| | echo "str1 : $str1
"; |
| | echo "str2 : $str2
"; |
| | |
| | |
| | |
| | if (($str1 == $str2) && !($b === $c) && (strlen($c) === 4)) { |
| | include('flag.php'); |
| | echo " |
| | $flag |
| |
"; |
| | } |
| | |
| | } |
| | |
| | |
| | ?> |
index.php代码在注释里。
那就照着这个逻辑来搞:
- 首先要使level1 的session值为‘go’,这要满足a参数:
$a2 = @file_get_contents($a,'r'); |
| | |
| | if($a2=="12345")
因为发现a参数可以是httpURL地址,所以想到用自己的VPS上的接口,Flask做的上传文件的页面,现在直接将HTML内容改成12345
,API: http://xx.xx.xx.xx:3421/file/upload,浏览器访问看到返回12345
OK。
然后先访问下:http://114.115.170.172:10010/index.php?a=http://xx.xx.xx.xx:3421/file/upload
然后就到了下一步:
结合代码逻辑,现在的重难点就是怎么找到B,C, h,r且满足 :
B是纯数字,C是4位大写字母,h,r都小于6位。
且,B的Md5值
,与将C的md5值里的H依顺序替换成R后的结果
相等。
最终有个结果:(上班了补充细节,这部分是同事搞出来的)
3. Third Blood of Web:(这道题想了好久,同事一样,都没想到用PHP://filter)
file参数改一下:
然后用 PHP://filter 读取此PHP,如下(这里注意对 php://filter有过滤,但没有判断大小写,所以这里绕过: Php://filter)
此时就想到肯定有戏了:
将返回内容用base64解码:
得到:
按照左边的代码逻辑,构造参数即可。
4. Forth Blood of Web:
贪吃蛇
贪吃蛇
绿色食物
灰色毒品
蓝色滑板
红色刹车
最高分:0
上面个页面是个JS的贪吃蛇游戏,我开始也看到anss
这个字符的不一样了,可是没想到直接在console里打出来,结果老大做出来,就没弄,做另一题了。其实直接cobsole.log(anss)出来:
ZzJsVXR0NG9ub1VzX1NuN2E4ZQo=
现在一看,就是base64编码,解码即得flag。