前言

本文首发i春秋论坛。

本篇文章主要分享一个python暴破脚本,该脚本采用optparse模块,支持自定义字典位置;用了多线程(虽然我感觉和单线程速度差不多。。是我的错觉还是线程写的不对。。求表哥们指教)。

一、PHP安全编程
这篇文章暴破的目标是自己写的一个简单demo,php写的,用了PDO预编译预防SQLI,用了htmlspecialchars简单防御xss,源码放出来:
数据库配置文件(dbname:pybp;table:pybp_table;column:username,passwd)Con_self.php:

    <?php
$pdo = new PDO('mysql:host=localhost;dbname=pybp', 'root', 'root');
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->exec("set names 'utf8'");
?>

登录处文件login_self.php:

    <?php
include('con_self.php');
?>
<form action='' method='POST' name='form1'>
user: <input type='text' name='username'><br>
passwd:<input type='text' name='passwd'><br>
<input type='submit' value='login' name='login'>
<input type='submit' value='add' name='add'>
</form>
<?php
if(isset($_POST['add'])){
$username = htmlspecialchars($_POST['username']);
$passwd = htmlspecialchars($_POST['passwd']);
$sm = $pdo->prepare("insert into pybp_table(username,passwd) values(?,?)");
$sm->execute(array($username,md5($passwd)));
}
if(isset($_POST['login'])){
$username = htmlspecialchars($_POST['username']);
$passwd = htmlspecialchars($_POST['passwd']);
$smt = $pdo->prepare("select * from pybp_table");
$smt->execute(array());
$result = $smt->fetchAll();
if($username===$result[]['username']&&md5($passwd)===$result[]['passwd']){
header("Location:/pybp_pdo/welcome_self.php"."?user=".$username);
}
else{
echo 'login fail';
}
}
?>

以及登录认证成功后跳转的welcome.php:

    <html>
<p>welcome <?php echo $_GET['user'];?></p>
<html>

有关于csrf防御,参见http://bbs.ichunqiu.com/thread-15186-1-1.html,就不赘述了。
Ok,看看界面:


然后咱们就试试爆破这个登陆界面了

二、python登陆暴破
py脚本原版先放出来:

    #coding: utf-
#author: xiaoye
import requests if __name__ == '__main__':
data = {}
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}
url = 'http://localhost/pybp_pdo/login_self.php'
#data = {'username':'admin','passwd':'admin','login':'login'}
userlist = [x.strip('\n') for x in open('pybp_self_user.txt').readlines()]
#print userlist
passwdlist = [x.strip('\n') for x in open('pybp_self_passwd.txt').readlines()]
#print passwdlist
for user in userlist:
for passwd in passwdlist:
data['username'] = user
data['passwd'] = passwd
data['login'] = 'login'
print data
r = requests.post(url,data=data,headers=headers)
if r.status_code == :
if r.content.find('welcome') != -:
print 'user:%s, passwd:%s' % (user,passwd)
exit()
data.clear()

运行截图:

整个程序用列表生成式,获取了user 、passwd两个字典的全部内容,并且将它们组合为dict形式,用requests.post去一一模拟登陆,并从返回的页面源码中提取响应的关键字来判断是否已经登陆成功。

基本的思想就是这样,但是前面的这个程序很死,连字典位置都不能自定义,速度有点慢(这个其实正常,两个只含有10个词字典,10*10的话,就要爆破100次,而且requests的速度还受网络的限制)

改善版:

optparse自定义字典位置(多线程出了点问题,我改完后放出来):

    #coding: utf-
#author: xiaoye
import requests
from optparse import OptionParser if __name__ == '__main__':
parse = OptionParser()
parse.add_option('-u','--u',dest='userfile',type='string',help='specify user file')
parse.add_option('-p','--p',dest='passfile',type='string',help='specify passwd file')
option,args = parse.parse_args()
data = {}
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}
url = 'http://localhost/pybp_pdo/login_self.php'
#data = {'username':'admin','passwd':'admin','login':'login'}
userlist = [x.strip('\n') for x in open(option.userfile).readlines()]
#print userlist
passwdlist = [x.strip('\n') for x in open(option.passfile).readlines()]
#print passwdlist
for user in userlist:
for passwd in passwdlist:
data['username'] = user
data['passwd'] = passwd
data['login'] = 'login'
print data
r = requests.post(url,data=data,headers=headers)
if r.status_code == :
if r.content.find('welcome') != -:
print 'user:%s, passwd:%s' % (user,passwd)
exit()
data.clear()

看运行gif:

Optparse模块还是挺好用的,命令行参数用着方便些

关于爆破,有个坑得说一说,验证码
关于验证码识别,我常用的是tesseract-ocr,效果还行吧,对中文的识别比较蛋疼。。。。。。
从csdn截了个验证码,试试看效果:

效果还可以
对于python这种轮子众多的语言来讲,也有自己处理验证码的模块,pytesseract (依赖于tesseract&&PIL)
用法如下:

#coding: utf-
import pytesseract
import PIL
image = PIL.Image.open('v2code.png')
v = pytesseract.image_to_string(image)
print v

效果:

遇见有验证码的登陆窗口,我们可以向上面的小程序用python做简单处理

三、小彩蛋
这次小彩蛋挺有意思的,介绍了python
selenium,有关于selenium,光是安装就是个大坑,可以试着去踩踩~。。。。。。tips:selenium
启动不了过高版本firefox,要安装引擎文件;默认selenium操作firefox会打开一个初始的,没有任何插件的火狐浏览器,这时候可以指明firefox
profile,启动我们日常用的浏览器(安装一下就知道我说的意思了。。)

代码:(自动化打开firefox,打开csdn登陆界面,自动化输入用户名/密码登陆)
截图工具崩了。。借个网上的图来看看情况http://img.blog.csdn.net/20150821031951877
下面代码运行情况和这个情况差不多,全程是不需要人手工点击的,自动化完成,自动化登录csdn源码如下:

    from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import re profile_dir = r"C:\Users\xiaoye\AppData\Roaming\Mozilla\Firefox\Profiles\3xhizvy7.default"
profile = webdriver.FirefoxProfile(profile_dir)
driver = webdriver.Firefox(profile)
driver.get("https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn")
elem_user = driver.find_element_by_name("username")
elem_user.send_keys("your username")
elem_pwd = driver.find_element_by_name("password")
time.sleep()
elem_pwd.send_keys("your passwd")
elem_pwd.send_keys(Keys.RETURN)
time.sleep()
assert "baidu" in driver.title
driver.close()
driver.quit()

其中,profile_dir是火狐的配置文件地址,每个人都不一样
your username是你的用户名,passwd是你的密码
运行之后,就自动化操作了
为啥python爆破会讲到这个呢?。。自动化能不能爆破呢?当然可以,下次有时间试试吧
Selenium经常应用在自动化测试以及爬虫上,普通静态页面抓取一般只需要三个模块:re正则模块  bs4解析模块 requests请求模块;但是对于像ajax动态生成的页面,selenium是个不错的选择。

php安全编程&python测试实例编写的更多相关文章

  1. 用 Python 测试框架简化测试

    用 Python 测试框架简化测试 摘要:本文将向您介绍了三种流行 Python 测试框架(zope.testing,py.test,nose)的基本特性,并讨论新一代的测试风格. 最近出现了行业级的 ...

  2. python实例编写(6)--引入unittest测试框架,构造测试集批量测试(以微信统一管理平台为例)

    ---恢复内容开始--- 一.python单元测试实例介绍 unittest框架又叫PyUnit框架,是python的单元测试框架. 先介绍一个普通的单元测试(不用unittest框架)的实例: 首先 ...

  3. spark编程python实例

    spark编程python实例 ValueError: Cannot run multiple SparkContexts at once; existing SparkContext(app=PyS ...

  4. python测试mysql写入性能完整实例

    这篇文章主要介绍了python测试mysql写入性能完整实例,具有一定借鉴价值,需要的朋友可以参考下 本文主要研究的是python测试mysql写入性能,分享了一则完整代码,具体介绍如下. 测试环境: ...

  5. Python测试 ——开发工具库

    Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. selenium - web UI自动化测试. mechanize- Python中有状态的程序化Web浏 ...

  6. python测试开发工具库汇总(转载)

    Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. selenium - web UI自动化测试. mechanize- Python中有状态的程序化Web浏 ...

  7. python基础——实例属性和类属性

    python基础——实例属性和类属性 由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(objec ...

  8. 从零使用Python测试。Testing Using Python.

    0. 写在前面 本人使用Python测试已有多年,略有些皮毛经验.每次有新员工入职,都会从头教一遍如何入门上手使用Python进行测试.趁这段有空,整理成文档,也好方便后续新员工学习.文章如有不妥之处 ...

  9. python测试框架&&数据生成&&工具最全资源汇总

    xUnit frameworks 单元测试框架frameworks 框架unittest - python自带的单元测试库,开箱即用unittest2 - 加强版的单元测试框架,适用于Python 2 ...

随机推荐

  1. 百度地图缩小后marker点的图标移动

    遇到的坑:使用百度地图,当地图缩小时,marker点的自定义图标会出现偏移的问题,marker点的信息窗口会出现闪烁问题. 原因:1.anchor是定位点距离图片左上角的偏移量.如果不给anchor的 ...

  2. Spring Boot SSL

    转载  https://howtodoinjava.com/spring-boot/spring-boot-ssl-https-example/ Spring Boot SSL 学习如何将Web应用程 ...

  3. SummerNote 富文本编辑器 - Rails 集成

    使用官方提供的CDN服务 将下面一段加入layout文件中 <link href="http://netdna.bootstrapcdn.com/bootstrap/3.3.5/css ...

  4. Oracle定时任务Job笔记

    定时任务应用场景: 某一个生产系统上面,临时表不断变多,占了不少磁盘空间.由于这套软件是直接买的,不方便修改源代码.所以考虑使用Oracle定时任务直接从数据库层删除临时表. 定时任务业务: 首先写好 ...

  5. gooflow学习笔记

    前端jqury脚本实现流程设计,兼容目前主流浏览器 gooflow 默认属性节点只有:id,name,top,left,width,height,type (各个版本不同,属性节点有所增加),但是这些 ...

  6. docker--centos镜像安装tomcat jdk1.8 mysql部署java web项目

    一.下载centos7标准镜像及安装mysql5.7 在centos安装mysql5.7 二.安装jdk 1.查询可用jdk版本 yum search java|grep jdk 2.根据搜索到的jd ...

  7. P2024 食物链

    题面:P2024 食物链 emmm其实不太难想 开三倍的数组 1~n:是当前动物的同类 n~2*n:是当前动物吃的动物 2*n~3*n:是吃当前动物的动物 emmmm #include<iost ...

  8. 如何在SpringBoot项目中使用拦截器

    相比springmvc,springboot中拦截器不需要在xml中配置,只需定义拦截器类 implements HandlerInterceptor 和拦截器拦截路径的配置类extends WebM ...

  9. 分享一个14年写的用户管理类-swift版

    AccountManager类 14年设计,从swift 0.9开始,迭代到现在swift4.0版本,总体几乎没什么改动,简单稳定. 其实现的思路主要还是借助之前net反射的经验,实现了自动保存用户信 ...

  10. python3中 tkinter模块创建window窗体、添加按钮、事务处理、创建菜单等的使用

    开始接触桌面图形界面编程,你可以到安装路径  \lib\tkinter 打开__init__.py 文件了解tkinter 1    tkinter 模块创建窗体,代码如下截图: 运行结果,如有右图显 ...