SQL查詢結果集對注入的影響及利用
錯誤提示主要有邏輯錯誤和語法錯誤以及指令碼執行錯誤三類。
一:邏輯錯誤
簡單的例子是1=1 1=2這兩個,1=1與1=2頁面不同的原理是什麼?以$sql = "select * from news where id=$_GET[id]"為例。
select * from news where id=1 and 1=2產生的結果集為NULL,然後程式取值得時候,就會去出空值,無法顯示。當然有的程式發現SQL執行結果集為空,就立即跳轉,效果就不顯鳥。值得注意的是,有的如Oracle Postgresql的資料庫在結果集為空情況下會再頁面上表現字元型null字樣,這算是個特點。如果使用or條件,比如
select * from news where id=1 or 1=1
和and 1=2得結果正好相反,他的結果集十分龐大。如果SQL語句如此,再加上程式是迴圈讀取結果集(一些程式設計上的陋習)那麼會取出所有結果,結果可能執行很慢,在資料量巨大的Oracle上容易出現。這個例子會出現什麼呢,一般程式取出結果集中的第一條結果,那麼很可能已經不是id=1的那條新聞了,這就是由些小菜奇怪有時候or 1=1頁面會發生變化的原因。
歸根到底,都是結果集不同造成的,靈活掌握是關鍵,這並非單純的經驗問題。
二:語法錯誤
語法錯誤時比較熟悉的,比如對於sql server,PgSQL,Sybase的注入錯誤提示都很重要,因為利用它的特性來獲取資訊很快速。語法錯誤造成的結果可能是SQL錯誤而中斷指令碼執行,但是指令碼或伺服器設定遮蔽錯誤的情況下,程式得到繼續執行,但是結果集不存在,連NULL都算不上,反饋給攻擊者的很可能就是結果集為空的情況,其實這是指令碼的處理結果。當然Oracle PgSQL表現null。
三:執行錯誤不用說了,典型的就是利用MySQL隱碼攻擊benchmark讓指令碼執行超時得到物理路徑,以及利用超時來獲得不同的表徵進行盲注入。
四:邏輯錯誤和語法錯誤的結合。
當表徵極不明顯的時候,利用類似iff這樣的函式進行正確與否的區分有時候會成救命稻草。因為語法錯誤和邏輯錯誤的表徵大多數情況都會有不同。
iff(1=1,1,'no')這個會產生結果1 注意是數字,而iff(1=2,1,'no')這個會產生'no' 是字元。那麼
id=1 and 1=iff(1=1,1'no')正確是必然成立的,而id=1 and 1=iff(1=2,1,'no')會因為型別不同發生語法錯誤。不過可惜的是似乎支援iff函式的資料庫不多,呵呵。
現在講結果集在注入中的利用原理。
一:從'or''='開始
這是學習SQL隱碼攻擊的初級課程,登陸漏洞。我簡略從SQL結果集上分析。
$sql = "select top 1 * from admin where username='$username' and password=md5('$password')";
顯而易見,'or''='的加入使SQL語句返回了一條記錄,這才使驗證通過。
二:再看現在的驗證中的SQL
$sql = "select top 1 * from admin where username='$username'";
結果集不為空才根據抽取的記錄集中的密碼值與使用者提交的密碼MD5值進行比對來進行驗證。這樣,你突然發現'or''='的計策失敗鳥,但是後臺明明有注入,這就是驗證方法造成的。跟進這個驗證過程,'or''='的確產生了一個結果集(admin表中的第一行記錄)但是遺憾的事,後來的密碼比對沒法通過,驗證無法成功。
思路很簡單,網上有案例,我重在原理,利用union來產生想要的結果集。比如'and(1=2)union select top 1 username,'123456得md5值',id from admin where username='admin
這樣產生了admin的記錄資訊,但是記錄集中的密碼那個
位置的值被替換成了123456的md5值,這樣,使用admin 123456通過驗證並且繼承他的權利。更有甚者全部用'xxx'的方法來盲狙,這就很“過分”鳥。不過在sql2000 sybase這些嚴格要求型別匹配的資料庫來說,這樣不能撼動“管理員登陸”的,因為執行時發生了語法錯誤,結果集為NULL。另外以前ewebeditor注入漏洞來上傳馬也是這個union操作結果集來達到目的的經典案例。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-616633/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- NOT IN子查詢中出現NULL值對結果的影響你注意到了嗎Null
- 備忘:laravel 對查詢結果集可以迴圈where查詢Laravel
- JPA SQL 查詢、結果集對映(@NamedNativeQuery、@ColumnResult註解說明)SQL
- SQL Server對組合查詢結果排序方法SQLServer排序
- 淺談SQL Server中統計對於查詢的影響SQLServer
- 複合索引中前導列對sql查詢的影響索引SQL
- 【SQL*Plus】直接X掉視窗對SQL*Plus中的操作結果的影響SQL
- PB帶引數帶結果集的動態SQL查詢SQL
- DDL,DML操作對結果快取的影響快取
- Mybatis 查詢語句結果集總結MyBatis
- PLSQL Language Referenc-PL/SQL靜態SQL-帶有子查詢的查詢結果集處理SQL
- MySQL:查詢欄位數量多少對查詢效率的影響MySql
- xsl中,對xml文件查詢的結果再次查詢XML
- 詳解表連線順序和連線方式是否影響查詢結果
- PLSQL Language Referenc-PL/SQL靜態SQL-查詢結果集處理SQL
- oracle 索引升降序及排序條件 對查詢計劃的影響Oracle索引排序
- Arraysize的設定以及對查詢效能的影響
- PostgreSQL函式:返回表查詢結果集SQL函式
- DBeaver 匯出多個查詢結果集
- ORDER對查詢結果進行排序排序
- 利用資料泵匯出查詢結果(二)
- 利用資料泵匯出查詢結果(一)
- 使用ROWNUM將導致查詢結果集的固化
- MaxCompute如何對SQL查詢結果實現分頁獲取SQL
- 並行查詢對於響應時間的影響實驗並行
- [Mysql 查詢語句]——對查詢結果進一步的操作MySql
- 探索webpack熱更新對程式碼打包結果的影響(二)Web
- 探索webpack熱更新對程式碼打包結果的影響(一)Web
- 小議分析函式中排序對結果的影響(二)函式排序
- 小議分析函式中排序對結果的影響(一)函式排序
- dex最佳化對Arouter查詢路徑的影響
- Postgresql MVCC架構對從庫長查詢的影響SQLMVC架構
- SQL 把查詢結果當作"表"來使用SQL
- 動態sql查詢結果多行的處理情況SQL
- JAVA + Oracle儲存過程返回查詢結果集JavaOracle儲存過程
- 巧用臨時表將大結果集轉換為小結果集驅動查詢薦
- mysql查詢結果多列拼接查詢MySql
- 新增欄位對SQL的影響SQL