2013年一个滂沱的雨天,我在黎巴嫩的LIU大学第一次接触了“Big O notation”这个术语,我没想到这个术语对我来说影响深远。
大O表示法在数据结构和计算机科学中用于描述一段代码或算法的复杂性。基本上,它用于描述算法执行时间的最坏情况。在这篇文章中,Big O Notation被称为“O([复杂性])”。
复杂度的范围为O(1)-O(n!), O(1)—常数阶:最低的时空复杂度,也就是耗时与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。例如,声明变量,打印字符串。时间复杂度为O(n)—线性阶,就代表数据量增大几倍,耗时也增大几倍。,例如遍历数组。O(n^2)表示与输入数据类型的平方大小或嵌套迭代的平方成正比的增长,依此类推。
JWT是一个JSON对象,在RFC 7519中定义为表示客户端和服务器之间的一组信息的安全方法。令牌由标头、有效负载和签名组成。几天前,在SQL盲注的漏洞利用阶段,我注意到JWT令牌的窃取过程非常缓慢。因此,我决定优化这个过程。
在优化窃取过程之前,了解JWT标记或正在获取的数据的结构非常重要,因为窃取单个字符将花费数千个请求乘以sleep()时间,并且这一过程可能会被绕过或由几行代码处理,除非你有办法知晓内容长度、标头等关键信息。
Header组件包含有关如何计算JWT签名的信息。Header是以{ "typ": "JWT", "alg": "HS256" }为格式的JSON对象,其base64编码的哈希数据为“eyJ0eXAiOiJKV1QiLCJhbGciOiJIUI1NiJ9”。在本例中,“typ”键的值指定JWT对象,而“alg”的值指定使用哪种哈希算法创建JWT签名组件。在这个JWT中,它是HMAC-SHA256算法。
对于整个HS256 JWT令牌,需要3384个(字符x ascii字符范围的数量)请求来过滤头eyj0exaioijkv1qilchbgcioijiuzi1nij9和14,570个请求。然而,这个报头几乎是固定的,并且可以减少到仅两个请求来识别正在使用的是哪种哈希算法。
在所有JWT报头哈希算法中,前11个字符是相同的。索引11处的字符指定正在使用的哈希算法,例如,I代表HMAC,S代表RSA PKCS,F代表ECDSA,Q代表RSA PSS。索引14处的字符指定密钥比特,如下图所示,字符I,M,U分别为256,384,512。因此,知道这些字符是什么将在窃取过程中避免使用数千个请求。
映射JWT报头哈希算法。
用于标识JWT标记的哈希算法的两个数组。
虽然数字和字母表是相同的,但JWT不一样。因此,我想出了一种方法来创建3个排序数组,数字,大写字符和小写字符,分别为[0-9],[A-Z],[a-z]。现在我们能遍历单个数组,而不是遍历所有ASCII字符以获得单个字符,这使得我们的复杂性为O(N)。但是,“n”现在是单个输入数据类型大小(在我们的示例中是数组)的大小,而不是所有ASCII字符的大小。
为每个数据集创建树。
树创建函数
为了更清晰的理解O(log(N))复杂度,你可以看一下下面的二叉树图。二叉树是另一种数据结构类型,左树的复杂性是O(N),因为如果你想搜索数字6,你必须首先迭代所有的数字。然而,在右边的树中它是O(log(N)),因为我们将树的大小减半,并且获得数字6所需的最大步数是3。
找出哪棵树与模式匹配,以便只对其进行迭代。
获取字符函数。
Blind SQL注入是一种SQL注入攻击,它询问数据库的真或假问题,并根据OWASP页面中定义的应用程序响应确定答案。我用PHP编写了一个简单的易受攻击的脚本来演示这种攻击,如下图所示。
“pid”GET参数容易受到Blind SQL注入的攻击。
由于响应内容不同,因此不需要使用基于时间的Blind注入攻击,不过这将减慢每个获取的字符的窃取过程。因此,ascii和子字符串mysql函数符合我们的标准。
Blind MySQL注入Payload
上述有效负载将迫使我们遍历所有ASCII字符-这是传统的JWT令牌窃取方式,其复杂性是JWT令牌的长度(n)乘以ASCII字符的长度(m), O(n(m))。因此,为了获取单个字符/模式,我使用了rlike和二进制转换MySQL函数。
使用rlike和Binary Casting MySQL函数。
优化方法后的复杂度为O(n(log(m))。
无论是试图窃取JWT令牌还是任何其他数据格式,难点在于用最少的请求来最小化此过程。
这并不是一种新的方法,但它是我用来加速JWT标记的窃取过程的一种优化方法。
Exploit: https://github.com/Leoid/MySQL-Injection-Exfiltration-Optimization
https://portswigger.net/web-security/sql-injection/blind
https://en.wikipedia.org/wiki/Big_O_notation
https://en.wikipedia.org/wiki/JSON_Web_Token
https://www.geeksforgeeks.org/binary-tree-data-structure/
https://www.w3resource.com/mysql/string-functions/mysql-rlike-function.php
http://www.sqlinjection.net/time-based/
原文:http://b1twis3.ca/jwt-exfiltration-optimization-with-mysql-injection/