首先查看源代碼, 沒有什么可以利用的
題目提示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后,不能用雙引號來引用字符串,因為它被解釋為識別符