1. 程式人生 > >南郵攻防平臺學習筆記(web篇)

南郵攻防平臺學習筆記(web篇)

1、MD5 collision

<?php
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
    echo "nctf{*****************}";
} else {
    echo "false!!!";
}}
else{echo "please input a";}
?>

首先來就題論題,題目要求get請求為引數a傳參,並且引數值不等於QNKCDZO,但是兩者的md5值要相同。這是由於php弱型別導致的bug,百度上有這些:

var_dump(md5('240610708') == md5('QNKCDZO'));
var_dump(md5('aabg7XSs') == md5('aabC9RqS'));
var_dump(sha1('aaroZmOk') == sha1('aaK1STfY'));
var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m'));
var_dump('0010e2' == '1e3');
var_dump('0x1234Ab' == '1193131');
var_dump('0xABCdef' == ' 0xABCdef');
bool(true) bool
(true) bool(true) bool(true) bool(true) bool(true) bool(true)

都是ture。這道題的話直接給a傳入240610708就可以得到flag了。

—————–不華麗的分割線—————-

為什麼上面的式子成立呢?

php在處理hash字串的時候會用到!=,==來進行hash比較,如果hash值以0e開頭,後邊都是*數字*,再與數字比較,就會被解釋成0*10^n還是為0,就會被判斷相等。上面的hash值都是0xe(數字)。

var_dump("0e1234abc"=="0") 0e後面不是數字了就判斷為false

要是換成”===”呢?

都為false。由於php是弱型別語言,相等(==)只判斷兩者的值是否相等,並且在比較前將其型別轉換為一致再進行比較;

而全等(===)是判斷型別和值,當兩者的型別和值都相等值才為true。

我們可以探測一下後臺密碼儲存的方式,把你的密碼設成 0x1234Ab,然後退出登入再登入,換密碼 1193131 登入,如果登入成功,那麼密碼絕對是明文儲存的;同理,密碼設定為 240610708,換密碼 QNKCDZO 登入能成功,那麼密碼沒加鹽直接md5儲存的。

最後,密碼比較的時候要用hash_equls()比較。((PHP 5 >= 5.6.0, PHP 7))

2、檔案包含

訪問連線這就是一個典型的檔案包含的漏洞
遇到了這樣的檔案包含漏洞,就可以使用filter的方式讀取php的原始碼了。用法如下:

http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resourc=index.php

檢視手冊可以看到php有許多協議
- file:// — 訪問本地檔案系統
- http:// — 訪問 HTTP(s) 網址
- ftp:// — 訪問 FTP(s) URLs
- php:// — 訪問各個輸入/輸出流(I/O streams)
- zlib:// — 壓縮流
- data:// — 資料(RFC 2397)
- glob:// — 查詢匹配的檔案路徑模式
- phar:// — PHP 歸檔
- ssh2:// — Secure Shell 2
- rar:// — RAR
- ogg:// — 音訊流
- expect:// — 處理互動式的流

此題涉及的是php://(訪問各個輸入輸出流的協議)

php://filter 是一種元封裝器, 設計用於資料流開啟時的篩選過濾應用。 這對於一體式(all-in-one)的檔案函式非常有用,類似 readfile()、 file() 和 file_get_contents(), 在資料流內容讀取之前沒有機會應用其他過濾器。

php://filter 目標使用以下的引數作為它路徑的一部分。 複合過濾鏈能夠在一個路徑上指定。詳細使用這些引數可以參考具體範例。

名稱 描述
resource=<要過濾的資料流> 這個引數是必須的。它指定了你要篩選過濾的資料流。
read=<讀鏈的篩選列表> 該引數可選。可以設定一個或多個過濾器名稱,以管道符(
write=<寫鏈的篩選列表> 該引數可選。可以設定一個或多個過濾器名稱,以管道符(
<;兩個鏈的篩選列表> 任何沒有以 read= 或 write= 作字首 的篩選器列表會視情況應用於讀或寫鏈。

——–分割線———

php.net中兩個基本的例子:

<?php
/* 這會以大寫字母輸出 www.example.com 的全部內容 */


readfile(“php://filter/read=string.toupper/resource=http://www.example.com”);



<?php
/* 這會通過 rot13 過濾器篩選出字元 “Hello World”
  然後寫入當前目錄下的 example.txt */


file_put_contents(“php://filter/write=string.rot13/resource=example.txt”,”Hello World”);


在這個例子中,php會先把Hello World字串做string.rot13轉換然後再寫入檔案,這在場景A中會有用到。

2、利用場景

A.在黑哥(膜拜黑哥)的關於[技術挑戰-2]有提到,這裡只說和php://filter有關的部分。

下面一段程式碼:

<?php
$str = ‘<?php exit(\’74\’);?>’.$_GET[‘c’];
$fname = $_GET[‘f’];
file_put_contents($fname,$str);

如何成功將phpinfo();寫入檔案並執行?利用上面提到的基礎知識可以提交如下連結:

http://127.0.0.1:81/test.php?f=php%3A%2f%2ffilter%2fwrite%3Dconvert.base64-decode%2fresource%3Dwebshell.php&c=dddPD9waHBpbmZvKCk7Pz4

值得注意的有兩點:

1). base64_decode()會忽略要解碼字串中無效字元像<>?;等,這裡給出base64_decode()函式忽略無效字元相應的c函式程式碼

   ch = base64_reverse_table[ch];
    if ((!strict && ch < 0) || ch == -1) { /* a space or some other separator character, we simply skipo    ver */                    continue;
    } else if (ch == -2) {
         efree(result);
         return NULL;
    }

2). 將

<?php 
include($_GET[‘file’]);

你想檢視和本程式碼同一目錄下config.php的內容。如何檢視呢

http://127.0.0.1:81/test.php?file=php://filter/convert.base64-encode/resource=config.php

3、sql3

4、ereg()漏洞
ereg()在讀到%00就不再往下讀了
更多php常見漏洞

不過,手冊告訴我們:

This function was DEPRECATED in PHP 5.3.0, and REMOVED in PHP 7.0.0.

Alternatives to this function include:

preg_match()

5、bypass again

也是php弱型別導致的漏洞
md5()函式本來只能接收String型別的引數的,如果接收一個數組型別則值為null。
md5()函式也不提倡來儲存使用者的密碼,
關於密碼雜湊的知識

6、pass check

php strcmp()函式的漏洞

在官方的文件有這麼一端說明:

Note a difference between 5.2 and 5.3 versions

echo (int)strcmp('pending',array());
will output -1 in PHP 5.2.16 (probably in all versions prior 5.3)
but will output 0 in PHP 5.3.3

Of course, you never need to use array as a parameter in string comparisions.

大概意思就是5.3的之前和之後版本在使用strcmp比較陣列和字串時候的差異。在5.3的版本之後使用這個函式比較會返回0。

7、綜合題

考查linux下歷史檢視的命令

history命令:

history 快速找到之前出現過的命令;

history N 顯示最近的N條命令;

history -d N 刪除第N條命令,N為前面的編號數;

history -c 清空歷史命令;

注:清除history之後,.bash_history裡仍會有歷史記錄,如何不讓系統記錄歷史命令:
export HISTSIZE=0

history -a 將當前會話中的命令歷史寫入指定檔案;

history | grep -i “xxx” 模糊查詢

那什麼是指定檔案呢?
就是歷史記錄的環境變數資訊,它通常會儲存在使用者家目錄下的.bash_history。

vim .bash_history檢視內容

echo $HISTFILE 使用此命令檢視環境變數

echo $HISTFILESIZE 檢視最大儲存數目

改變環境變數

export HISTCONTROL=ignoreboth

Don’t save duplicates

export HISTSIZE=10000

*這個是針對history命令的設定,The number of commands to remember in the command history. The default value is 500
*
export HISTFILESIZE=10000

這個是針對history檔案(.bash_history)的設定,The maximum number of lines contained in the history file. When this variable is assigned a value, the his-tory file is truncated, if necessary, by removing the oldest entries, to contain no more than that number of lines. The default value is 500. The history file is also truncated to this size after writing it when an interactive shell exits.

export HISTIGNORE=’ls’

*A colon-separated list of patterns used to decide which command lines should be saved on the history list.Each pattern is anchored at the beginning of the line and must match the complete line
*
以上的關於history的說明都可以使用man bash查的到,如果想要讓你的配置永久生效,可以把export命令寫到.bash_profile或者全域性配置檔案/etc/profile裡

8、密碼重置

vim下的備份檔案,一般情況下備份檔案一般都是myfile.txt~或者是.myfile.txt.swp

(這只是個人做題過程中的一些筆記心得,歡迎批評指正)

相關推薦

攻防平臺學習筆記web

1、MD5 collision <?php $md51 = md5('QNKCDZO'); $a = @$_GET['a']; $md52 = @md5($a); if(isset($a)){ if ($a != 'QNKCDZO' &&am

Angular學習筆記工具----Angular CLI

進入 詳情 基礎 rate 9.png cnpm 基本用法 版本問題 問題 Angular CLI 的作用 首先安裝npm 和node 詳情:http://www.cnblogs.com/gorgeous/p/8074180.html 在安裝 npm in

HTML教程學習筆記第一

學習資料:www.w3cschool.cc   學習日期:2014-11-03 1.DOCTYPE宣告文件型別: HTML5:<!DOCTYPE html> HTML4.01:<!DOCTYPE HTML PUBLIC "-//W3C//DTD H

Opengl es2.0 學習筆記API所有API的翻譯

包含了 gl2.h 和egl.h兩個標頭檔案 gl2.h gl2資料結構 /*------------------------------------------------------------------------- * Data type defi

深度學習筆記基礎——線性單元和梯度下降

        在上一篇文章中,我們已經學會了編寫一個簡單的感知器,並用它來實現一個線性分類器。你應該還記得用來訓練感知器的『感知器規則』。然而,我們並沒有關心這個規則是怎麼得到的。本文通過介紹另外一種『感知器』,也就是『線性單元

深度學習筆記基礎——機器學習與深度學習簡介

  機器學習是最基礎的(當下初創公司和研究實驗室的熱點領域之一)。深度學習是非常嶄新和有影響力的前沿領域。 一、定義 1、機器學習    從樣本中學習的智慧程式。是資料驅動的。90年代初提出。強調的是給計算機程式(或者機器)輸入一些資料後,它學習這些資料,而

《深入分散式快取:從原理到實踐》學習筆記最終

第十四章 典型電商應用與快取 及時響應性的使用者需求 資料準確行需求 平臺海量請求的訴求 高可用訴求 14.1 電商類一個你用的挑戰及特點 穩定性決定服務能力 高併發場景(Scale Out 加機器、Scale Up 提

C++學習筆記初級——作用域與“extern”關鍵字

作用域,顧名思義,就是指某個識別符號在程式中的有效區域。 在C++中,按作用域的大小,一般可分為區域性作用域和全域性作用域。 1.區域性作用域 區域性作用域用大括號,即{},來定義,大括號括起來的範圍就是一個區域性作用域。區域性作用域內,一個變數或者函式的有效位置是從其宣告

C++學習筆記第一

第1章 C++基本知識 1.1 宣告類和物件 三種方式 /********************************************** 第一種方式:宣告類的同時定義物件 **************************

Git 學習筆記基礎

1. 命令初識 檢視GIT版本 git --version 在Global級別設定UserName(推薦使用) git config --global user.name ’Freud Kang‘ 在當前目錄界別設定UserName(優先順序高)git config us

XSS學習筆記入門

最近的學習速度挺快的,對於寒假的計劃是對於各種知識點都瞭解大概並且基本懂得原理,在開學之後對相關書籍深入研究! 這裡我就先總結下幾個XSS應用的例子吧。 一.利用< >標記注射html / javascript 如果可以隨心所欲引入< >標記,那麼

uip-學習筆記移植

UIP 1、 uip_input(); 當網絡卡驅動收到一個包時,將包存放於全域性緩衝區uip_buf中,包的大小由全域性變數uip_len約束;同時將呼叫uip_input();該函式會根據包首部的協議處理這個包將該包傳送給需要該包的應用程式;當該函

CTF——攻防平臺web

一、簽到題 火狐瀏覽器中開啟頁面,F12開啟開發人員工具檢視網頁原始碼,發現flag: 二、md5 collision 題目所給的php原始碼如下: <?php $md51 = md5('QNKCDZO'); $a = @$_GET['

CTF--攻防平臺web2

一、download~! 這道題有點難度啊啊啊啊啊 1、右鍵檢視原始碼: 發現url後為歌曲名的base64編碼 2、將url後換為download.php的base64編碼http://way.nuptzj.cn/web6/download.php

java-web學習筆記第一章

第一章 靜態網站 文件 jdk cat CA 結果 靜態 web入門 第一章:javaweb入門??1,靜態網站和動態網站的區別??2,知道c/s結構和b/s結構??3,web應用程序的處理過程:????用戶通過瀏覽器向服務器發送請求;????服務器端處理用戶的請求;???

java-web學習筆記第二章

直接 () destroy 垃圾回收 垃圾回收器 troy 鏈接 ems cse 第二章:Servlet基礎 1,創建Servlet有幾種方式?處理http請求最好使用哪種方式?  1>直接實現Servlet接口和它的所有方法;&emsp

攜程 Apollo 配置中心 | 學習筆記十一| 如何引入Apollo配置中心改造老Web專案?

本章將介紹如何從Apollo配置中心獲取配置。專欄目錄:歡迎關注個人公眾號:  Coder程式設計歡迎關注個人網站:www.52melrin.com需求:將老Web專案接入Apollo配置中心。(主要為非Maven專案)思路:這裡主要是針對客戶端client進行修改。一、修改

Web API學習筆記Python實現

   參考指南: Web API入門指南 http://www.cnblogs.com/guyun/p/4589115.html 用Python寫一個簡單的Web框架 http://www.cnblogs.com/russellluo/p/3338616.html W

Java for Web學習筆記二五:JSTL1使用JSTL

在前面已經使用過JSTL,例如<c:url>,fn是JSTL的functionlibrary,而c是JSTL的tag library。使用它們,我們要告知解析器,如下: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core

電商平臺學習筆記——Mybatis啟動異常org.apache.ibatis.type.TypeException

java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadC