CLI 工具和库,用于轻松执行 填充预言攻击,支持并发网络请求并拥有优雅的 UI。
确保已安装 Node.js,然后运行
$ npm install --global padding-oracle-attacker
或
$ yarn global add padding-oracle-attacker
用法
$ padding-oracle-attacker decrypt <url> hex:<ciphertext_hex> <block_size> <error> [选项]
$ padding-oracle-attacker decrypt <url> b64:<ciphertext_b64> <block_size> <error> [选项]
$ padding-oracle-attacker encrypt <url> <plaintext> <block_size> <error> [选项]
$ padding-oracle-attacker encrypt <url> hex:<plaintext_hex> <block_size> <error> [选项]
$ padding-oracle-attacker analyze <url> [<block_size>] [选项]
命令
decrypt 对给定密文(hex:0123abcd)查找明文(foobar)
encrypt 对给定明文(foo=bar)查找密文(hex:abcd1234)
analyze 帮助判断 URL 是否易受攻击,以及当解密错误发生时响应的差异
(用于 <error> 参数)
参数
<url> 要攻击的 URL。默认情况下负载会附加在末尾。要指定自定义注入点,
请在头部(-H)、请求体(-d)或 URL 中包含 {POPAYLOAD}
<block_size> 服务器上加密算法使用的块大小
<error> 当服务器解密失败时响应中出现的字符串。
指定 HTTP 响应体中的字符串(如 PaddingException)
或 HTTP 响应的状态码(如 400)
选项
-c, --concurrency 并发发送的请求数 [默认: 128]
--disable-cache 禁用网络缓存。默认保存到 [默认: false]
poattack-cache.json.gz.txt
-X, --method 发起请求时使用的 HTTP 方法 [默认: GET]
-H, --header 随请求发送的头部。
-H 'Cookie: cookie1' -H 'User-Agent: Googlebot/2.1'
-d, --data 请求体
JSON 字符串: {"id": 101, "foo": "bar"}
URL 编码: id=101&foo=bar
请确保指定 Content-Type 头部。
-e, --payload-encoding {POPAYLOAD} 的密文负载编码 [默认: hex]
base64 FooBar+/=
base64-urlsafe FooBar-_
hex deadbeef
hex-uppercase DEADBEEF
base64(xyz) 自定义 base64('xyz' 代表 '+/=' 字符)
--dont-urlencode-payload 不对 {POPAYLOAD} 进行 URL 编码 [默认: false]
--start-from-1st-block 从第一个块而不是最后一个块开始处理 [默认: false]
(仅适用于 decrypt 模式)
示例
$ poattack decrypt http://localhost:2020/decrypt?ciphertext=
hex:e3e70d8599206647dbc96952aaa209d75b4e3c494842aa1aa8931f51505df2a8a184e99501914312e2c50320835404e9
16 400
$ poattack encrypt http://localhost:2020/decrypt?ciphertext= "foo bar 🦄" 16 400
$ poattack encrypt http://localhost:2020/decrypt?ciphertext= hex:666f6f2062617220f09fa684 16 400
$ poattack analyze http://localhost:2020/decrypt?ciphertext=
别名
poattack
padding-oracle-attack
const { decrypt, encrypt } = require('padding-oracle-attacker')
// 或
import { decrypt, encrypt } from 'padding-oracle-attacker'
const { blockCount, totalSize, foundBytes, interBytes } = await decrypt(options)
const { blockCount, totalSize, foundBytes, interBytes, finalRequest } = await encrypt(options)
decrypt(options: Object): Promiseencrypt(options: Object): Promiseurl: string要攻击的 URL。默认情况下负载会附加在末尾。要指定自定义注入点,请在 URL、头部(requestOptions.headers)或请求体(requestOptions.data)中包含 {POPAYLOAD}
blockSize: number服务器上加密算法使用的块大小。
isDecryptionSuccess: ({ statusCode, headers, body }) => boolean函数,如果服务器响应表示解密成功则返回 true。
ciphertext: Buffer(仅 decrypt)要解密的密文。
plaintext: Buffer(仅 encrypt)要加密的明文。会自动添加填充。示例:Buffer.from('foo bar', 'utf8')
concurrency: number = 128并发发送的网络请求数。
isCacheEnabled: boolean = true默认启用缓存并保存到 poattack-cache.json.gz.txt。设置为 false 可禁用缓存。
requestOptions: { method, headers, data }requestOptions.method: string发起请求时使用的 HTTP 方法。默认为 GET。其他有效选项如 POST、PUT、DELETE。
requestOptions.headers: { string: string }随请求发送的头部。示例:{ 'Content-Type': 'application/x-www-form-urlencoded' }
requestOptions.body: string请求体。可以是 JSON 字符串、URL 编码参数等。需要手动设置 Content-Type 头部。
logMode: 'full'|'minimal'|'none' = 'full'full:将所有内容输出到控制台(默认)
minimal:仅在开始和完成后输出到控制台
none:不输出任何内容到控制台
transformPayload: (ciphertext: Buffer) => string在发起请求时将 ciphertext 转换为字符串的函数。默认情况下,ciphertext 以十六进制编码并插入注入点(除非存在 {POPAYLOAD},否则为 URL 末尾)。
decrypt)alreadyFound: Buffer已知/已找到的明文字节(从末尾开始),可以跳过。如果提供十个字节的 Buffer,则跳过最后十个字节。
initFirstPayloadBlockWithOrigBytes: boolean = false使用原始 ciphertext 字节而不是零来初始化第一个负载块。
示例:abcdef12345678ff 1111111111111111 而不是 00000000000000ff 1111111111111111
startFromFirstBlock: boolean = false从第一个块而不是最后一个块开始处理。
makeInitialRequest: boolean = true使用提供的原始 ciphertext 发起一个初始请求,并将服务器响应输出到控制台,以便用户确认网络请求发送正确。
encrypt)makeFinalRequest: boolean = true在找到新 plaintext 的 ciphertext 字节后,使用找到的字节发起最终请求,并将服务器响应输出到控制台。
lastCiphertextBlock: Buffer最后一个块的自定义密文。默认最后一个块全为零(000000000000000)。
padding-oracle-attacker 使用 TypeScript 编写。如果你想修改源文件并运行它们,可以先将文件编译为 JS 再使用 node 运行,或者使用 ts-node。
示例:yarn build 然后 node dist/cli ... 或直接 ts-node src/cli ...
yarn build 或 npm run build将 src 目录中的 TypeScript 文件编译为 JS 文件,并输出到 dist 目录。
yarn clean 或 npm run clean删除 dist 目录。
yarn lint 或 npm run lint使用 eslint 检查代码。
yarn test 或 npm run test检查代码并使用 ava 运行测试。
node test/helpers/vulnerable-server.js运行测试服务器,该服务器易受填充预言攻击,地址为 http://localhost:2020
MIT © Kishan Bagaria