SQL盲注(1)
簡介
Web應用訪問資料庫的目的有很多。常見目的就是訪問資料並呈現給使用者。在這種情況下,攻擊者就有可能會修改SQL語句並顯示資料庫中的任意資訊,並將這些資訊寫入到Web伺服器對HTTP請求的響應之中。有時不顯示資料庫的資訊,但並不表示程式碼不會受到SQL注入攻擊。
列如,使用者輸入任意使用者名稱及密碼時,會顯示“Invalid username or password”,但如果將user' or '1'='1作為使用者名稱的話,輸入任意密碼,會顯示“Invalid password”。顯然username欄位更容易受到SQL注入攻擊
在輸入永假條件(user' or '1'='2)檢查返回值的差異,進一步核實username欄位更易受到攻擊。
做完測試後可以得知,username欄位更易受到SQL注入攻擊,但password欄位不易受到攻擊,且無法繞開身份驗證。
該情況下,並沒有顯示任何資料,我們只知道兩件事。
- 在username欄位為真時,表單顯示“Invalid password”
- 在username欄位為假時,表單顯示“Invalid username or password”
這種情況,稱為SQL盲注。
舉例
假設本地的show.php頁面接受一個id的get引數,返回相應id的商品資訊,可以按下列請求來檢視商品資訊
http://127.0.0.1/show.php?id=1 --返回第一件商品資訊
http://127.0.0.1/show.php?id=2 --返回第二件商品資訊
http://127.0.0.1/show.php?id=3 --返回三件商品資訊
http://127.0.0.1/show.php?id=4 --返回第四件商品資訊
且本地做了部分安全考慮,在監測到錯誤輸入時,會返回第一件商品資訊。所以下列請求會返回第一件商品資訊
http://127.0.0.1/show.php?id=attacker
http://127.0.0.1/show.php?id=attacker’
http://127.0.0.1/show.php?id=
http://127.0.0.1/show.php?id=999999999999999999999999999(不存在的產品id)
http://127.0.0.1/show.php?id=-1
減法測試
下列請求會返回第二件商品資訊
http://127.0.0.1/show.php?id=3-1
http://127.0.0.1/show.php?id=4-2
http://127.0.0.1/show.php?id=5-3
由此可知,已將get引數傳遞給SQL語句並按下列方式執行:
select * from products where id=3-1
資料庫計算減法的值並返回第二件商品資訊
加法測試
如果要測試加法的話,因為加號(+)時URI的保留字,所以要對其進行編碼,%2B代表對加號的URL編碼.
http://127.0.0.1/show.php?id=2%2B3(對id=2+3進行URL編碼)
http://127.0.0.1/show.php?id=1%2B4(對id=1+4進行URL編碼)
利用永真及永假條件進行測試
or運算子
http://127.0.0.1/show.php?id=2 or 1=1 --返回第一件商品資訊
http://127.0.0.1/show.php?id=2 or 1=2 --返回第二件商品資訊
第一條請求中 or 1=1 要求返回所有商品資訊,資料庫監測到錯誤時,返回第一件商品資訊
第二條請求中 and 1=1 對結果無影響
and運算子
http://127.0.0.1/show.php?id=2 and 1=1 --返回第二件商品資訊
http://127.0.0.1/show.php?id=2 and 1=2 --返回第一件商品資訊