CVE-2020-24913 的 PoC,存在于 qcubed(所有版本,包括 3.1.1)中的 SQL 注入漏洞,位于 profile.php,通过 strQuery 参数,允许未经身份验证的攻击者通过精心构造的 POST 请求注入 SQL 代码来访问数据库。此 PoC 使用 MySQL 数据库执行。我们无法使用堆叠查询负载(如同 PostgreSQL 那样),因此必须通过基于时间的方法来利用此漏洞。
在 "strProfileData" 参数中,我们使用以下载荷(未编码): a:1:{i:0;a:3:{s:12:"objBacktrace";a:1:{s:4:"args";a:1:{i:0;s:3:"pwn";}}s:8:"strQuery";s:38:"(SELECT * FROM (SELECT(SLEEP(10)))CP);";s:11:"dblTimeInfo";s:1:"1";}}
易受攻击的参数是 "strProfileData"。发送到服务器的成功请求如下所示。发送到此参数的 PHP 序列化数组必须进行 base64 编码。
对于以下图片,strProfileData 参数已进行 base64 解码,以便读者更清晰地查看,但如上所述,它必须以 base64 编码形式发送。
以下请求包含一个使服务器睡眠 10 秒的查询。我们将通过向数据库发送 SQL 查询来利用 SQL 注入漏洞,该查询强制数据库在响应之前等待指定的时间(以秒为单位)。
为了从数据库中获取数据,我们将使用一个 IF 结构,该结构根据条件是否成立使数据库睡眠更多或更少的时间。
在下图中,我们获取了数据库版本(8.0.XX)的第一个字符。
我们使用 SQL 查询 "SLEEP(5-(IF(SUBSTRING(@@version,X,1)='Y',2,5)))",如果条件为真,则使数据库睡眠 (5-2)=3 秒;如果条件为假,则使数据库睡眠 (5-5)=0 秒。条件为:数据库版本中位置 X 的字符等于字符 Y。
