Classification:Program

Classification (Program)'s result:

phpstorm+phpstudy+xdebug配置

环境win7+phpstorm2018.3+phpstudy2016+php5.6.27-nts+apache   1. phpstudy开启xdebug扩展   2.修改php.ini: 结尾添加: [XDebug] xdebug.profiler_output_dir=”D:\phpStudy\tmp\xdebug” xdebug.trace_output_dir=”D:\phpStudy\tmp\xdebug” zend_extension=”D:\phpStudy\php\php-5.6.27-nts\ext\php_xdebug.dll”   xdebug.profiler_append = 0 xdebug.profiler_enable = 1 xdebug.profiler_enable_trigger = 0 xdebug.profiler_output_name = “cache.out.%t-%s” xdebug.remote_enable = 1 xdebug.remote_handler = “dbgp” xdebug.remote_mode = “req” xdebug.remote_host = “127.0.0.1” xdebug.remote_port = 9010 xdebug.idekey= PHPSTROM     phpstorm配置与phpstudy同步:    //如果只在phpstudy里面打开项目或者开发就填phpstudy路径就ok      3. 配置xdebug         4. 安装并开启浏览器插件xdebug helper   5. 调试

PHP伪协议总结

0x00 php://input //所有测试均allow_url_fopen=On,allow_url_include=On!!! php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。 而且,这样的情况下 $HTTP_RAW_POST_DATA 默认没有填充, 比激活 always_populate_raw_post_data 潜在需要更少的内存。 enctype=”multipart/form-data” 的时候 php://input 是无效的。 ——php.net 简单说就是获取post数据。 测试代码: <?php $d = file_get_contents(‘php://input’); //echo $d; @eval($d) ?> 文件包含变命令执行: 测试代码: <?php @include($_GET[“file”]); ?> 写一句话:   0x01 php://filter php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。 ——php.net 简单说经常利用它进行base64编码,如 php://filter/read=convert.base64-encode/resource=file:///c:/windows/win.ini” 可以运用多种过滤器(字符串/转换/压缩/加密) 常用于读取文件/源码:   0x02 zip://,bzip2://,zlib:// zlib: 的功能类似 gzopen(),但是 其数据流还能被 fread() 和其他文件系统函数使用。 自 PHP 4.3.0 后这个不建议被使用,因为会和其他带“:”字符的文件名混淆; 请使用 compress.zlib:// 作为替代。 compress.zlib://、 compress.bzip2:// 和 gzopen()、bzopen() 是相等的。并且可以在不支持 fopencookie 的系统中使用。 ZIP 扩展 注册了 zip: 封装器。 自 PHP 7.2.0 和 libzip 1.2.0+ 起,加密归档开始支持密码,允许数据流中使用密码。 字节流上下文(stream contexts)中使用 ‘password’ 选项设置密码。 可选项 zlib://file.gz bzip2://file.bz2 zip://archive.zip#dir/file.txt ——php.net 简单说就是直接访问压缩包里的文件。 1. zip:// 将phpinfo.txt压缩成zip,实战中可以改后缀为jpg绕过上传限制。 http://192.168.43.173:8999/lsawebtest/phptest/phprotocol1.php?file=zip://C:/phpStudy/PHPTutorial/WWW/lsawebtest/phptest\phpinfo.jpg%23phpinfo.txt 注意要用绝对路径+url编码#   2. zlib:// http://192.168.43.173:8999/lsawebtest/phptest/phprotocol1.php?file=compress.zlib://C:/phpStudy/PHPTutorial/WWW/lsawebtest/phptest/phpinfo.txt.gz 改后缀为jpg亦可,相对路径亦可。   3. bzip2:// 同理于zlib://   0x03 data:// data://text/plain;base64, http://192.168.43.173:8999/lsawebtest/phptest/phprotocol1.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOyA/Pg== 不加//亦可。 也可以用来读php文件源码: data:text/plain,<?php system(‘cat /var/www/phprotocol1.php’)?> 或者命令执行: data:text/plain,<?php system(‘whoami’)?>   0x04 结语 ctf中常利用php伪协议,实战中或许会有奇效。 //图片来源:freebuf   0x05 参考资料 https://www.waitalone.cn/php-file-include.html www.freebuf.com/column/148886.html http://php.net/manual/zh/wrappers.php

启发式搜索解决八数码问题

0x01 前言 昨天遇到八数码问题,瞬间想到小时候玩的拼图游戏,大概长这样 (图片来源于百度图片) 看似简单但是印象中就没成功过……,不过,利用启发式搜索,这个问题就是秒解了,接下来介绍两种解决八数码问题的方法,本人认为这是启发式搜索的两种实现方式。 0x01 启发式搜索0 第一种方法较简单,步骤如下: 1.计算初始评估值,这里评估值是不在正确位置的点的数量。 2.利用队列搜索,从四个方向移动空格获得新节点,计算新节点的评估值。 3.如果新节点评估值小于等于父节点评估值+1,就是优秀节点,加入队列。 4.直到找到评估值为0的节点,就是结果。 代码如下: //代码来源于blog.csdn.net/wangqiuyun/article/details/7840771 加入了少许注释。 #include <iostream> #include <stdio.h> #include <stdlib.h> #include <time.h> using namespace std; #define N 3 //数码组大小 #define Max_Step 50 //最大搜索深度 #define MAX 50 typedef struct node//八数码结构体 { int form[N][N];//数码组 int evalue;//评估值 int udirect;//所屏蔽方向,防止往回推到上已状态,1上2下3左4右 struct node *parent;//父节点 }Graph; Graph *Qu[MAX];//队列 Graph *St[MAX];//堆栈 /////////打印数码组 void Print(Graph *The_graph) { int i,j; if(The_graph==NULL) printf(“图为空\n”); else { printf(“———————\n”); for(i=0;i<N;i++) { printf(“|\t”); for(j=0;j<N;j++) { printf(“%d\t”,The_graph->form[i][j]);//遍历打印 } printf(“\t|\n”); } printf(“|\t\t\t差距:%d\t|\n”,The_graph->evalue);//差距显示 printf(“———————\n”); } } /////////评价函数 int Evaluate(Graph *The_graph,Graph *End_graph) { int valute=0;//差距数 int i,j; for(i=0;i<N;i++) { for(j=0;j<N;j++) { if(The_graph->form[i][j]!=End_graph->form[i][j]) //if num is not in right site,valute++ { valute++; } } } The_graph->evalue=valute; return valute; } /////////移动数码组 Graph *Move(Graph *The_graph,int Direct,int CreatNew_graph) { Graph *New_graph;// int HasGetBlank=0;//是否获取空格位置 int AbleMove=1;//是否可移动 int i,j,t_i,t_j,x,y; for(i=0;i<N;i++)//获取空格坐标i,j { for(j=0;j<N;j++) { if(The_graph->form[i][j]==0) { HasGetBlank=1; break; } } if(HasGetBlank==1) break; } //printf(“空格位置:%d,%d\n”,i,j); t_i=i; t_j=j; //移动空格 switch(Direct) { case 1://上 t_i–; if(t_i<0) AbleMove=0; break; case 2://下 t_i++; if(t_i>=N) AbleMove=0; break; case 3://左 t_j–; if(t_j<0) AbleMove=0; break; case 4://右 t_j++; if(t_j>=N) AbleMove=0; break; }……

Python 协程笔记0

0x00 啥是协程(coroutine) 用户态,共享堆,不共享栈,单线程,不需要锁机制。上下文切换比线程效率高,多用于IO密集型。IO耗时就切换到其他协程,极大提高效率,互相协作让控制权。异步IO,高并发。拥有自己的寄存器和栈,可保留状态。需要多进程配合才能运行在多核CPU上。线程越多,协程优势越明显。   0x01 为什么用协程 占用资源相对少(轻量级) 效率高(子程序切换) 不需要锁(单线程) 高性能,高并发   0x02 python中怎么用协程 Greenlet 手动切换 Gevent 自动调度,猴子补丁,greenlet模式,基于libev,底层epoll。   0x03 gevent简单用例 同步vs异步: #coding:utf-8 import gevent import random def task(number): gevent.sleep(random.randint(0,5)*0.001) #交出控制权 print(‘number %s done’ % number) def synchronous(): #同步 for i in xrange(5): task(i) def asynchronous(): #异步 c = [gevent.spawn(task, i) for i in xrange(5)] #spawn创建greenlet协程对象 gevent.joinall(c) #等待所有greenlet协程结束才退出 print(‘Synchronous:’) synchronous() print ‘—————————‘ print(‘Asynchronous:’) asynchronous() 更有用的例子: #coding:utf-8 from gevent import monkey; monkey.patch_all() #猴子补丁,把所有python原生库打上补丁变协作式 import gevent import urllib2 def getData(url): print(‘GET: %s’ % url) rsp = urllib2.urlopen(url) data = rsp.read() print(‘%d bytes received from %s.’ % (len(data), url)) gevent.joinall([ gevent.spawn(getData, ‘https://www.python.org/’), gevent.spawn(getData, ‘https://www.baidu.com/’), gevent.spawn(getData, ‘https://github.com/’), ]) 最好是需要协作的库才打补丁,避免影响其他功能,如from gevent import socket。 多线程和协程效率对比: 多线程版: #coding:utf-8 import socket import time import Queue import urllib2 import threading urls = [‘http://www.sina.com’, ‘http://www.gevent.org’, ‘https://www.python.org’,’https://www.baidu.com’,’https://github.com’,’http://www.cnblogs.cn’,’http://blog.csdn.net’] q = Queue.Queue() threads = 3 threadlist = [] tNumber = 0 for url in urls: q.put(url) def getData(): while not q.empty(): theUrl = q.get() print(‘GET: %s’ % theUrl) rsp = urllib2.urlopen(theUrl) data = rsp.read() print(‘%d bytes received from %s.’ % (len(data), theUrl)) start = time.time() for thread in range(threads): t =……

Java swing 界面卡死问题的分析与解决

0x00 问题概述 在用swing做一个项目的时候,发现程序在运行一个长时间任务的时候界面会卡死,直到任务完成。具体描述就是按下一个按钮执行任务,接着按钮就一直是按下的状态,界面卡死,直到这个任务完成才恢复正常。   0x01 问题分析 经过查阅资料,发现原来swing是线程不安全的,是单线程设计。Swing有初始线程,事件派发线程,工作线程。UI展示完毕之后初始线程就结束了,控制就交给了事件派发线程,这之后所有组件的事件行为都由事件派发线程处理,事件派发线程是调用paint和update等回调方法的线程,它还是事件监听器接口中定义的事件处理方法,也就是说只能从事件派发线程访问组件。这就是真相了,程序由事件派发线程执行一个任务,这时就要等待这个线程处理完这个任务,所以界面出现卡死现象,等这个任务结束了,事件派发线程就可以更新组件,就恢复正常了。所以,一些长时间的任务就要交给工作线程处理。   0x02 问题解决 最直接简单的方法就是把耗时长的任务单独开一个线程处理,即工作线程。   0x03 相关要点 要注意的是组件的更新(如进度条)最好别放在工作线程里,这是危险的,所以要单独开一个更新组件的线程,再把对象排到事件派发线程的队列中,这里要介绍两个函数: SwingUtilities.invokeLater():当可运行对象排在事件派发队列的队首时,就调用其run方法。其效果是允许事件派发线程调用另一个线程中的任意一个代码块。把可运行的对象放入队列后就返回。 SwingUtilities.invokeAndWait():和invokeLater一样,但是它一直等待知道已启动了可运行的run方法才返回。如果一个操作在另外一个操作执行之前必须从一个组件获得信息,则应使用SwingUtilities.invokeAndWait()方法。   0x04 参考资料 developer.51cto.com/art/200907/136290.htm blog.csdn.net/sjf8013/article/details/7693669 blog.csdn.net/zhenshiyiqie/article/details/7605533      

用python打造x云漏洞词云

0x00 前言 突然想做一个漏洞词云,看看哪些漏洞比较高频,如果某些厂商有漏洞公开(比如ly),也好针对性挖掘。就选x云吧(镜像站 http://wy.hxsec.com/bugs.php)。用jieba和wordcloud两个强大的第三方库,就可以轻松打造出x云漏洞词云。 github地址:https://github.com/theLSA/wooyun_wordcloud   0x01 爬取标题 直接上代码: #coding:utf-8 #Author:LSA #Description:wordcloud for wooyun #Date:20170904 import urllib import urllib2 import re import threading import Queue q0 = Queue.Queue() threads = 20 threadList = [] def gettitle(): while not q0.empty(): i = q0.get() url = ‘http://wy.hxsec.com/bugs.php?page=’ + str(i) html = urllib.urlopen(url).read() reg = re.compile(r'<li style=”width:60%;height:25px;background-color:#FFFFFF;float:left” ><a href=”.*?”>(.*?)</a>’) titleList = re.findall(reg,html) fwy = open(“wooyunBugTitle.txt”,”a”) for title in titleList: fwy.write(title+’\n’) fwy.flush() fwy.close() print ‘Page ‘ + str(i) + ‘ over!’ def main(): for page in range(1,2962): q0.put(page) for thread in range(threads): t = threading.Thread(target=gettitle) t.start() threadList.append(t) for th in threadList: th.join() print ‘***********************All pages over!**********************’ if __name__ == ‘__main__’: main() 0x02 打造词云 还是直接上代码: # coding: utf-8 import jieba from wordcloud import WordCloud import matplotlib.pyplot as plt data = open(“wooyunBugTitle.txt”,”r”).read() cutData = jieba.cut(data, cut_all=True) word = ” “.join(cutData) cloud = WordCloud( #设置字体,不指定可能会出现中文乱码 font_path=”msyh.ttf”, #font_path=path.join(e,’xxx.ttc’), #设置背景色 background_color=’white’, #词云形状 #mask=color_mask, #允许最大词汇 max_words=2000, #最大号字体 max_font_size=40 ) wc = cloud.generate(word) wc.to_file(“wooyunwordcloud.jpg”) plt.imshow(wc) plt.axis(“off”) plt.show() 0x03 效果演示: 0x04 结语 由词云图可以看出,SQL注入依旧风光无限,其次是命令执行,继而是信息泄漏,整体看还是比较直观的。 %e4%b9%8c%e4%ba%91%e5%b7%b2%e9%80%9d%ef%bc%8c%e6%9c%aa%e8%a7%81%e5%bd%a9%e8%99%b9    

记一次python2.7中文乱码的解决历程

0x00 前言 最近用python写个小爬虫,想回复下feeling,却被中文乱码的问题搞得寝食难安,不过经过两天的各种搜索尝试,还是解决掉了这个问题。 0x01 乱码前奏 我的环境:debian8+python2.7 那是一个风雨交加的夜晚,本人打算写个小小的爬虫,当我高兴地按下回车,控制台输出 UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position……,这好办,因为python默认是ascii编码,只有1个字节,当然无法编码中文,加上几行就ok: import sys reload(sys) sys.setdefaultencoding(‘utf-8’) 好,再来一次,冥冥之中我觉得事情不会这么顺利,果然,中文乱码隆重登场! 0x02 中文乱码 看见中文乱码,如下图: 第一感觉,稳住别乱!Python2.7中文乱码就像家常便饭,都是见过大风大浪的人了…….,控制台和写入文件夹一样的乱码,有了PHP中文乱码的经验,先看看哪里的编码没统一吧,如下: 1.python源码编码:utf-8 2.python源码的文件编码:utf-8 3.Python系统编码:utf-8(见0x01) 4.控制台编码:utf-8 5.文件系统编码:utf-8 6.爬取的json文件编码:貌似gbk 为什么说貌似呢,因为那是一个json文件,没META,但是看了下别的网页都是gbk。那应该就是这个问题了,那也好办,heroName[n].decode(‘gbk’).encode(‘utf-8’)就行咯,再运行一次,心想这下该没问题了,好的,真的没乱码了,如图: 但是输出的并不是人名啊,而是一串无意义的中文,这就奇怪了,输出了中文就证明解码应该没错了啊,那试试用gb2312解码 heroName[n].decode(‘gb2312’).encode(‘utf-8’),结果: UnicodeDecodeError: ‘gb2312’ codec can’t decode bytes in position 4-5,接着又各种decode各种encode,几乎都组合了一遍还是各种乱…… 0x03 一行解决 经过各种搜索,突然发现可以把get下来的网页再encoding,于是尝试加了这句: heroListHtml.encoding = ‘utf-8’,这下都是utf-8了,该和谐了吧,于是第n次运行,终于见到了正常的中文!从来都没觉得原来中文是这么诱人…… 0x04 结语 遇到乱码,别乱,没什么特殊的话就是编码不统一的问题了,仔细找,多搜索,应该就ok了,有时候,与其找问题原因,还不如避开问题,python2这个编码问题真是烦人啊,py3这个编码就好多了,不用decode/encode,直接中文变量都没事。最后,送神图一张 # # #             ┌─┐                  ┌─┐ #      ┌──┘ ┴───────┘ ┴──┐ #       │                                          │ #       │                ───                  │ #       │  ─┬┘                └┬─        │ #       │                                          │ #       │                 ─┴─                 │ #       │                                          │ #       └───┐                    ┌───┘ #                 │                     │ #                  │                    │ #                  │                    │ #                  │                    └──────────────┐ #                  │                                                             │ #                  │                                                             ├─┐ #                  │                                                             ┌─┘ #                  │                                                             │ #                  └─┐  ┐  ┌───────┬──┐  ┌──┘ #                       │ ─┤ ─┤                 │ ─┤ ─┤ #                       └──┴──┘             └──┴──┘ #                                      神兽保佑 ! #                                      永无乱码 ! #/

王者荣耀高清英雄大图赠送

听说xx荣耀最近很火,那不如一起……写个小爬虫玩玩,顺便找回手感。 功能说明: 爬取xx荣耀官网英雄大图,并保存到本地。 这是单线程版本,保存的地址根据自身情况修改。还写了个多线程版本,但是开5个线程就被反爬了,有空优化一下再发。 源码: #coding:utf-8 #Author:LSA #Description:crawler wzyy heros pics #Data:20170827 import requests,os,urllib2,json import sys reload(sys) sys.setdefaultencoding(‘utf-8’) heroListUrl = ‘http://pvp.qq.com/web201605/js/herolist.json’ headers = { “User-Agent”:”Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)” } def main(): print ‘Starting……’ heroListHtml = requests.get(heroListUrl,headers=headers) heroListHtml.encoding = ‘utf-8’ heroListJson = heroListHtml.json() #print heroListJson heroName = list(map(lambda x:x[‘cname’],heroListJson)) heroNumber = list(map(lambda x:x[‘ename’],heroListJson)) print ‘——–Total hero number ‘+str(len(heroNumber))+’———‘ print ‘Crawler……’ n = 0 for i in heroNumber: os.mkdir(“/lsa/Pictures/kingheropics/”+heroName[n]) os.chdir(“/lsa/Pictures/kingheropics/”+heroName[n]) print ‘===Get ‘+heroName[n]+’ pics===’ for j in range(1,16): heroUrl = “http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/%s/%s-bigskin-%s.jpg” % (str(i),str(i),str(j)) heroPic = requests.get(heroUrl,headers=headers) if heroPic.status_code == 200 or heroPic.status_code == 304: open(heroUrl.split(‘-‘)[-1],’wb’).write(heroPic.content) print ‘Got ‘+str(heroName[n])+’ pic’+’ ‘+str(j) else: break n = n + 1 print ‘=========================All over!=======================’ if __name__==’__main__’: main() 效果图: 写这个程序的时候遇到了中文乱码问题,将在下一篇文章中细细道来。  

用python实现多种http请求

0x00 主要的HTTP请求: 1. GET :从指定的服务器中获取数据。 2. POST :提交数据给指定的服务器处理。 3. HEAD:类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头。 4. OPTIONS:查询可以执行哪些请求,也可以利用向Web服务器发送’*’的请求来测试服务器的的性能。 5. PUT:向指定资源位置上传其最新内容。 6. MOVE:请求服务器将指定的页面移至另一个网络地址。 7. DELETE:请求服务器删除Request-URI所标识的资源。 8. TRACE:回显服务器收到的请求,主要用于测试或诊断。 9. CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 10. COPY:请求服务器将指定的页面拷贝至另一个网络地址。 11. LINK:请求服务器建立链接关系。 12. UNLINK:断开链接关系。 13. LOCK(wedav):加锁。 14. UNLOCK(wedav):解锁。 0x01 python实现get,post,put,delete,options,head 请求: 利用了urllib2,requests,httplib库,其实利用其中之一便可以实现。 get请求比较简单,直接利用urllib2。 post请求由于可能需要cookie,header,data等元素,而且要看具体场合,这里就用requests简单post一下。 put请求用urllib2,实现了两遍,一个用opener一个不用opener,区别不大,实现了put文件到服务器的功能。 delete请求也实现了两遍,一个用http的client一个用urllib2,实现了删除服务器文件的功能。 options请求用httplib实现,用来获取信息(主要是allow的请求)。 head请求用httplib实现,用来获取报头信息。   0x02 源码: # -*- coding:utf-8 -*- #Author:LSA #Description:http’s get,post,put,delete,option,head methods #Date:20170804 #Version:v1.0 import urllib2 import urllib import json import httplib import requests import sys from http import client def http_get(url): rsp = urllib2.urlopen(‘http://’+url) return rsp.read() def http_post(url): data = {‘user’:’lsa’,’pwd’:’123456′} rsp = requests.post(‘http://’+url,data=data) return rsp.content def http_put(url): opener = urllib2.build_opener(urllib2.HTTPHandler) upfilepath = raw_input(‘upload file path: http://’+url+’/’) localfilepath = raw_input(‘local file path: ‘) with open(localfilepath) as f: data = f.read() rqt = urllib2.Request(‘http://’+url+’/’+upfilepath,data=data) #rqt.add_header(“Content-Type”, “image/png”) rqt.get_method = lambda:’PUT’ #rsp = urllib2.urlopen(rqt) #return rsp.read() rsp = opener.open(rqt) return rsp.read() def http_put2(url): upfilepath = raw_input(‘upload file path: http://’+url+’/’) localfilepath = raw_input(‘local file path: ‘) with open(localfilepath) as f: data = f.read() rqt = urllib2.Request(‘http://’+url+’/’+upfilepath,data=data) #rqt.add_header(“Content-Type”, “image/png”) rqt.get_method = lambda:’PUT’ rsp = urllib2.urlopen(rqt) return rsp.read() #rsp = opener.open(rqt) def http_delete(url): header……