从phpcmsv9.6.1谈常见变量覆盖


0x00

  之前看了phpcms以前的洞,phpcmsv9.6.1是存在任意文件读取的,漏洞分析:传送门其中parse_str扮演了关键角色。
  简单说下关键点,调用的file_down读取函数去读取$fileurl(由$s和$f拼接)文件路径,这里有正则过滤(不能读取php)

$fileurl = str_replace(array('<','>'), '',$fileurl);

这里str_replace导致$s,$f可以绕过正则过滤($s为1.ph,$f为<p),但是这里有个safe_replace()过滤函数使'<','>'被替换为空。这里经过的parse_str()能起urlencode的作用使传入url编码即可绕过safe_replace引入'<','>'。

0x01

  先看php.net中关于parse_str的介绍:将 encoded_string 解析为通过 URL 传递的查询字符串, 并在当前作用域中设置变量 (如果提供了结果, 则在数组中)。

<?php
$a ='b=%3e%3c';
parse_str($a);
function safe_replace($string){
    $string = str_replace('%20','',$string);
    $string = str_replace('%27','',$string);
    $string = str_replace('%2527','',$string);
    $string = str_replace('*','',$string);
    $string = str_replace('"','"',$string);
    $string = str_replace("'",'',$string);
    $string = str_replace('"','',$string);
    $string = str_replace(';','',$string);
    $string = str_replace('<','<',$string);
    $string = str_replace('>','>',$string);
    return $string;
}
$a = safe_replace($a);
echo $a."</br>";
echo $b;
?>


Nginx本地权限提升(cve-2016-1247)复现分析


0x01 复现分析

1.进入Ubuntu 发现为普通用户权限,输入su,密码root
切换至root权限下操作

①查看生成日志文件的配置文件:

cat /etc/logrotate.d/nginx

nginx日志用logrotate命令自动切割
②查看www-data权限:输入 cat /etc/passwd |grep www-data
发现返回www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

2.切换至www-data用户操作
①输入










渗透测试常见信息收集(python实现子域名与ip收集)


渗透测试中子域名和ip收集(我这里子域名用的网上找的接口,还是挺全的:二级域名查询

import urllib
import re
import sys
import socket 

def get_html(url):
    r = urllib.urlopen(url)
    res = r.read()
    return res

def scan_sub(html):
    resu = re.compile(r'<a href="http://(.*?)" rel=nofollow target=_blank>')
    a = resu.findall(html)
    return a

def get_ip():
    target_file = '%s.txt' % (sys.argv[1].split('.')[0] + '_ip')
    with open(target_file, 'w') as f:
        for i in file((sys.argv[1].split('.')[0]+".txt"),'rb'):
            i = i.strip()
            try:
                ip = socket.getaddrinfo(i, 'http')
                #print ip[0][4][0]       
                a = ip[0][4][0] + "\n"
                f.write(a)
            except:
                pass

api = 'http://i.links.cn/subdomain/'
target = sys.argv[1]
url = api + target + '.html'
html = get_html(url)

if __name__ == '__main__':
    
    result = scan_sub(html)
    b = '\n'.join(result)
    resfile = '%s.txt' % sys.argv[1].split('.')[0]
    print 'the result saved in ' + resfile + "\n"
    with open(resfile, 'w') as F:
        F.write(b)
    get_ip()     
    print 'the result_ip is saved in: %s.txt' % (sys.argv[1].split('.')[0] + '_ip')
    

贴一下效果图