php代碼審計(jì)-sql注入初級篇

概述

代碼審計(jì)顧名思義就是檢查源代碼中的缺點(diǎn)和錯(cuò)誤信息李破,分析并找到這些問題引發(fā)的安全漏洞哲虾,并提供代碼修訂措施和建議。這篇文章的目的是為了讓小伙伴們對php代碼審計(jì)有一個(gè)基本的了解,采用的代碼都是自己寫的僅僅能體現(xiàn)出漏洞所以會略顯簡潔。并且這次文章的主要內(nèi)容為代碼審計(jì)所以不會寫太多的注入語句响禽,更多的是對代碼的分析,有興趣的同學(xué)可以百度查查資料荚醒。

環(huán)境要求

phpstudy和一篇簡單易懂的php源碼

sql注入

SQL 注入(SQL Injection) 是發(fā)生在 Web 程序中數(shù)據(jù)庫層的安全漏洞芋类,是網(wǎng)站存在最多也是最簡單的漏洞。 主要原因是程序?qū)τ脩糨斎霐?shù)據(jù)的合法性沒有判斷和處理界阁,導(dǎo)致攻擊者可以在 Web 應(yīng)用程序中事先定義好的 SQL 語句中添加額外的 SQL 語句侯繁,在管理員不知情的情況下實(shí)現(xiàn)非法操作,以此來實(shí)現(xiàn)欺騙數(shù)據(jù)庫服務(wù)器執(zhí)行非授權(quán)的任意查詢泡躯,從而進(jìn)一步獲取到數(shù)據(jù)信息贮竟。 簡而言之,SQL 注入就是在用戶輸入的字符串中加入 SQL 語句较剃,如果在設(shè)計(jì)不良的程序中忽略了檢查坝锰,那么這些注入進(jìn)去的 SQL 語句就會被數(shù)據(jù)庫服務(wù)器誤認(rèn)為是正常的 SQL 語句而運(yùn)行,攻擊者就可以執(zhí)行計(jì)劃外的命令或訪問未被授權(quán)的數(shù)據(jù)重付。

一、union查詢注入

union查詢注入是MySQL注入中的一種方式凫乖,在SQL注入中說了注入漏洞存在的相關(guān)條件确垫,而聯(lián)合查詢注入這種方法需要滿足查詢的信息在前端有回顯,回顯數(shù)據(jù)的位置就叫回顯位帽芽。

源代碼

<?php

? ? ? ? require 'db.php';

? ? ? ? header('Content-type:text/html;charset=utf8');

? ? ? ? $username=$_POST["username"]; //獲取用戶輸入

? ? ? ? $password=$_POST["password"];

? ? ? ? $dl="SELECT * FROM xs WHERE username='$username' and password='$password'"; //登錄界面后臺處理

? ? ? ? $ck=mysqli_query($db,$dl);

? ? ? ? $row = mysqli_fetch_array($ck);

? ? ? ? if($row) {

? ? ? echo "你的賬號為:".$row['username'];

? ? ? echo "你的密碼為:".$row['password'];

? ? ? ? } else {

echo "你的輸入" .$username;

}

這段代碼一上來加載了一個(gè)文件db.php根據(jù)名字可以判斷是連接數(shù)據(jù)庫文件删掀,接著設(shè)置編碼為UTF8,然后獲取用戶輸入的賬號和密碼設(shè)置為變量导街,賦入sql查詢語句判斷賬號密碼是否輸入正確披泪,利用query執(zhí)行sql語句,再用mysqli_fetch_array把結(jié)果作為數(shù)組輸出到row中搬瑰。最后用if語句判斷sql語句是否執(zhí)行款票,執(zhí)行成功輸出用戶的賬號和密碼,執(zhí)行失敗會輸出用戶輸入的賬號泽论。代碼沒有任何防御艾少,有兩個(gè)回顯位所以直接union注入。

注入語句為-1' union select 1,2? #

二翼悴、sql盲注

所謂的盲注就是在服務(wù)器沒有錯(cuò)誤回顯的時(shí)候完成的注入攻擊缚够。服務(wù)器沒有錯(cuò)誤回顯,對于攻擊者來說缺少了非常重要的“調(diào)試信息

源代碼

<?php

? ? ? ? require 'db.php';

? ? ? ? header('Content-type:text/html;charset=utf8');

? ? ? ? $username=$_POST["username"]; //獲取用戶輸入

? ? ? ? $password=$_POST["password"];

? ? ? ? $dl="SELECT * FROM xs WHERE username='$username' and password='$password'"; //登錄界面后臺處理

? ? ? ? $ck=mysqli_query($db,$dl);

? ? ? ? $row = mysqli_fetch_array($ck);

? ? ? ? if($row) {

? ? ? ? ? ? echo "你的輸入" .$username;

? ? ? ? } else {

echo "輸入錯(cuò)誤" ;

}

代碼和上面聯(lián)合查詢基本一樣只是執(zhí)行成功以后沒有了回顯,只返回成功和失敗谍椅,我們可以使用用布爾盲注通過返回構(gòu)造的注入語句正確與否來獲取數(shù)據(jù)庫里的信息误堡。

注入語句

1' and length(database())=3 #?

三、sql延時(shí)注入

時(shí)間差注入也叫延遲注入雏吭,是一種盲注的手法提交對執(zhí)行時(shí)間銘感的函數(shù)sql語句锁施,通過執(zhí)行時(shí)間的長短來判斷是否執(zhí)行成功,比如:正確的話會導(dǎo)致時(shí)間很長思恐,錯(cuò)誤的話會導(dǎo)致執(zhí)行時(shí)間很短沾谜,這就是所謂的高級盲注。

源代碼

<?php

? ? ? ? require 'db.php';

? ? ? ? header('Content-type:text/html;charset=utf8');

? ? ? ? $username=$_POST["username"]; //獲取用戶輸入

? ? ? ? $password=$_POST["password"];

? ? ? ? $dl="SELECT * FROM xs WHERE username='$username' and password='$password'"; //登錄界面后臺處理

? ? ? ? $ck=mysqli_query($db,$dl);

? ? ? ? $row = mysqli_fetch_array($ck);

? ? ? ? if($row) {

? ? ? ? ? ? echo "你的輸入" .$username;

? ? ? ? } else {

? ? ? ? ? ? echo "你的輸入" .$username;

}

這次執(zhí)行成功和失敗返回的結(jié)果一模一樣布爾盲注的方法也不行了胀莹,我們可以使用延時(shí)注入語句讓瀏覽器語句執(zhí)行成功的同時(shí)延時(shí)五秒基跑,延時(shí)注入一般用if()加sleep語句配合burpsuite。

注入語句

1' and if((length(database())=3),sleep(5),1) #

四描焰、報(bào)錯(cuò)注入

報(bào)錯(cuò)注入就是利用了數(shù)據(jù)庫的某些機(jī)制媳否,人為地制造錯(cuò)誤條件,使得查詢結(jié)果能夠出現(xiàn)在錯(cuò)誤信息中荆秦。

源代碼

<?php

? ? require 'db.php';

? ? header('Content-type:text/html;charset=utf8');

? ? $username = $_POST["username"]; //獲取用戶輸入

? ? $password = $_POST["password"];

? ? $dl = "SELECT * FROM xs WHERE username='$username' and password='$password'"; //登錄界面后臺處理

? ? $ck = mysqli_query($db, $dl);

? ? $row = mysqli_fetch_array($ck);

if($row)

{

? echo "登錄成功";

? }

else

{

print_r(mysql_error());

}

}

報(bào)錯(cuò)注入就是利用返回錯(cuò)誤信息的函數(shù)篱竭,把注入的結(jié)果通過錯(cuò)誤信息返回來,這里可以看到代碼執(zhí)行失敗以后會調(diào)用報(bào)錯(cuò)函數(shù)步绸,可以直接在賬號框里構(gòu)造報(bào)錯(cuò)注入代碼掺逼,下面示范采用的updatexml語句。報(bào)錯(cuò)注入常用的有floor,updatexml,extractvalue這三種瓤介。

注入語句

admin") and updatexml(1,concat(0x7e,(select database()) ,0x7e),1) #

五吕喘、cookie注入

Cookie注入簡單來說就是利用Cookie而發(fā)起的注入攻擊。從本質(zhì)上來講刑桑,Cookie注入與傳統(tǒng)的SQL注入并無不同氯质,兩者都是針對數(shù)據(jù)庫的注入,只是表現(xiàn)形式上略有不同罷了祠斧。

先來看看源碼


require 'db.php';

header('Content-type:text/html;charset=utf8');

$username=addslashes($_POST['username']);

$password=MD5($_POST['password']);

$dl="SELECT * FROM xs WHERE username='$username' and password='$password'"; //登錄界面后臺處理

$ck=mysqli_query($db,$dl);

$row = mysqli_fetch_array($ck);

if($_POST['login']){

if($row) {

setcookie('uname',$row['username']);

$cooke=$_COOKIE['uname'];

$ql="select * from xs where username='$cooke'";

$qk=mysqli_query($db,$ql);

$row1 = mysqli_fetch_array($qk);

if($row1){

echo "nidecooke 創(chuàng)建成功";

}

}

}?>

可以看到cookie注入和上面的代碼有很大的區(qū)別闻察。前面一大段是正常的登錄判斷語句,賬號用了addslashes()語句進(jìn)行轉(zhuǎn)義琢锋,密碼通過MD5加密辕漂。而cookie語句在if($row)主體里,也就是說只有我們繞過了或者輸入正確的賬號和密碼才會去創(chuàng)建cookie吴超。創(chuàng)建cookie以后帶入了sql語句里直接執(zhí)行钮热。從代碼上面來看注入位置不在登錄框在cookie里。cookie查詢語句執(zhí)行完以后也沒有回顯烛芬,所以我們在cooki位置用布爾盲注試試隧期。先用burpsuite抓包就能看見cookie了飒责。切記在注入的時(shí)候一定要輸入正確的賬號和密碼也就是if($row)需要返回正確的值下面的語句才會執(zhí)行。


可以看到uname=1 uname是上面代碼中創(chuàng)建的cookie我們只需在在這個(gè)位置進(jìn)行布爾盲注就可以拿到想要的數(shù)據(jù)仆潮。

構(gòu)造這個(gè)獲取當(dāng)前數(shù)據(jù)庫長度語句返回成功說明當(dāng)前數(shù)據(jù)長度為3.


sql注入初級篇就完結(jié)了宏蛉,這一篇只是小打小鬧讓對代碼審計(jì)還不了解的同學(xué)有一個(gè)初步的認(rèn)識,接下來幾篇會為大家講解一些比較難和有防御措施的代碼性置。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拾并,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鹏浅,更是在濱河造成了極大的恐慌嗅义,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隐砸,死亡現(xiàn)場離奇詭異之碗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)季希,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門褪那,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人式塌,你說我怎么就攤上這事博敬。” “怎么了峰尝?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵偏窝,是天一觀的道長。 經(jīng)常有香客問我武学,道長祭往,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任劳淆,我火速辦了婚禮,結(jié)果婚禮上默赂,老公的妹妹穿的比我還像新娘沛鸵。我一直安慰自己,他們只是感情好缆八,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布曲掰。 她就那樣靜靜地躺著,像睡著了一般奈辰。 火紅的嫁衣襯著肌膚如雪栏妖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天奖恰,我揣著相機(jī)與錄音吊趾,去河邊找鬼宛裕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛论泛,可吹牛的內(nèi)容都是我干的揩尸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屁奏,長吁一口氣:“原來是場噩夢啊……” “哼岩榆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坟瓢,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤勇边,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后折联,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粒褒,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年崭庸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怀浆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怕享,死狀恐怖执赡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情函筋,我是刑警寧澤沙合,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站跌帐,受9級特大地震影響首懈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谨敛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一究履、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧脸狸,春花似錦最仑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卿啡,卻和暖如春吟吝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颈娜。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工剑逃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浙宜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓炕贵,卻偏偏與公主長得像梆奈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子称开,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 系統(tǒng)介紹 CMS名稱:新秀企業(yè)網(wǎng)站系統(tǒng)PHP版 官網(wǎng):www.sinsiu.com 版本:這里國光用的1.0 正式...
    zsoft閱讀 391評論 0 0
  • 0x01 extract變量覆蓋 ?shiyan=&flag=1在file_get_contents($flag)...
    Shad0w_zz閱讀 3,621評論 0 1
  • 注入攻擊 OWASP將注入攻擊和跨站腳本攻擊(XSS)列入網(wǎng)絡(luò)應(yīng)用程序十大常見安全風(fēng)險(xiǎn)亩钟。實(shí)際上,它們會一起出現(xiàn)鳖轰,因...
    OneAPM閱讀 2,597評論 1 15
  • Web安全簡史 在Web1.0時(shí)代清酥,人們更多是關(guān)注服務(wù)器端動態(tài)腳本語言的安全問題,比如將一個(gè)可執(zhí)行腳本(俗稱Web...
    潘良虎閱讀 3,929評論 3 72
  • 一蕴侣、sql注入原理 SQL 注入就是指 web 應(yīng)用程序?qū)τ脩糨斎氲臄?shù)據(jù)合法性沒有過濾或者是判斷焰轻,前端傳入的參數(shù)是...
    卿酌南燭_b805閱讀 4,142評論 0 2