PACTF.No2 WriteUp-1

PACTF No.2 记录自己的First Blood.

1. First Blood of Web:

题目:

http://114.115.170.172:10400/


PACTF.No2 WriteUp-1_第1张图片
mobile

看到这个其实就想到怎样用所谓的“Pixel 2 XL手机”, 比赛题肯定不会让你去临时找个真的这种手机才行,但Chrome浏览器有个手机调试的功能,直接上:
打开F12.选择手机调试,选择“Pixel 2 XL”:

PACTF.No2 WriteUp-1_第2张图片
Pixel 2 XL

PACTF.No2 WriteUp-1_第3张图片
F12

根据提示,修改请求方式为:LGET, 添加HTTP请求头部:Referer:pixel

PACTF.No2 WriteUp-1_第4张图片
flag

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)
但弄了好久也没啥用。
到了晚上,扔扫描器扫了下:

PACTF.No2 WriteUp-1_第5张图片
index.php~

看源码可以更清楚:

|  |
|  |  |
|  |  |
|  | 正确的的道路!平安!碰碰碰!
";; | | | } | | | | | | $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 "

flag

| | | 要通过这一关需要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 "

flag

"; | | | | | | $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代码在注释里。

那就照着这个逻辑来搞:

  1. 首先要使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,浏览器访问看到返回12345OK。
然后先访问下:http://114.115.170.172:10010/index.php?a=http://xx.xx.xx.xx:3421/file/upload
然后就到了下一步:

PACTF.No2 WriteUp-1_第6张图片
image.png

结合代码逻辑,现在的重难点就是怎么找到B,C, h,r且满足 :
B是纯数字,C是4位大写字母,h,r都小于6位。
且,B的Md5值,与将C的md5值里的H依顺序替换成R后的结果 相等
最终有个结果:(上班了补充细节,这部分是同事搞出来的)

flag

3. Third Blood of Web:(这道题想了好久,同事一样,都没想到用PHP://filter)

PACTF.No2 WriteUp-1_第7张图片
image.png

PACTF.No2 WriteUp-1_第8张图片
image.png

file参数改一下:
PACTF.No2 WriteUp-1_第9张图片
image.png

然后用 PHP://filter 读取此PHP,如下(这里注意对 php://filter有过滤,但没有判断大小写,所以这里绕过: Php://filter)
PHP://filter

此时就想到肯定有戏了:
将返回内容用base64解码:
得到:


PACTF.No2 WriteUp-1_第10张图片
decode

按照左边的代码逻辑,构造参数即可。

4. Forth Blood of Web:





贪吃蛇




    
贪吃蛇
绿色食物 灰色毒品 蓝色滑板 红色刹车 最高分:0

上面个页面是个JS的贪吃蛇游戏,我开始也看到anss这个字符的不一样了,可是没想到直接在console里打出来,结果老大做出来,就没弄,做另一题了。其实直接cobsole.log(anss)出来:
ZzJsVXR0NG9ub1VzX1NuN2E4ZQo= 现在一看,就是base64编码,解码即得flag。

你可能感兴趣的:(PACTF.No2 WriteUp-1)