持續更新ing
0x09 PHP2

題目只有一句話,Can you anthenticate to this website?,其實說實話沒什么思路,根據dirsearch的結果,只有index.php存在,里面也什么都沒有,各路前輩說index.phps存在原始碼泄露,于是看了看,
<?php
if("admin"===$_GET[id]) {
echo("<p>not allowed!</p>");
exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "admin")
{
echo "<p>Access granted!</p>";
echo "<p>Key: xxxxxxx </p>";
}
?>
Can you anthenticate to this website?
上面這段代碼是驗證是否通過的條件,簡單來說就是傳入的id值不等于admin,但在url解碼后等于admin,a為%61,傳入%61dmin,發現直接被瀏覽器解碼為admin,影響了后續的判斷,于是對%再次編碼,傳入%2561dmin,得到flag,

0x10 unserialize3
打開題目為:
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=
傳入的code只要跳出魔法函式__wakeup即可,wakeup函式在反序列化的物件與真實存在的引數個數不同時會跳過執行,即當前函式中只有一個引數$flag,若傳入的序列化字串中的引數個數為2即可繞過,
寫如下代碼:
<?php
class xctf{
public $flag = '111';
}
$a = new xctf();
echo serialize($a);
得到結果O:4:"xctf":1:{s:4:"flag";s:3:"111";},將類xctf中的引數1修改為2,提交code,得到flag,
后續會對反序列化知識進行專門的學習,在此先以刷題為主,
0x11 upload1
創建環境失敗,
題目是一個js前端驗證的上傳,抓包修改提交引數或者修改前端js驗證都可繞過,
0x12 Web_python_template_injection
創建環境失敗,
題目是一個python模板注入(SSTI)的問題,后續會對SSTI進行詳細分析,也積累一下知識,
0x13 Web_php_unserialize
創建環境失敗,
根據題目可以看出是一個反序列化漏洞,后續也會對這部分內容進行補充,積累基礎知識,
0x14 supersqli(easysql)
題目來自于強網杯2019 的easysql,是一個注入題,先看下題目:

通過1’報錯,確定存在sql注入,

通過order by判斷欄位數為2,

在使用union聯合查詢時發現禁用了大部分的關鍵詞,

在這里其實我沒什么好的想法,使用變形繞過select也失敗,不斷報錯,網上的前輩們都講到了需要使用 堆疊注入 了,那聯合查詢和堆疊注入到底有什么不同的?
下面的話參考自SQL注入-堆疊注入(堆查詢注入),感謝前輩們的總結,
- 在SQL中,分號(;)是用來表示一條sql陳述句的結束,試想一下我們在 ; 結束一個sql陳述句后繼續構造下一條陳述句,會不會一起執行?因此這個想法也就造就了堆疊注入,
- 而union injection(聯合注入)也是將兩條陳述句合并在一起,兩者之間有什么區別么?區別就在于union 或者union all執行的陳述句型別是有限的,可以用來執行查詢陳述句,而堆疊注入可以執行的是任意的陳述句,
- 例如以下這個例子,用戶輸入:
1; DELETE FROM products服務器端生成的sql陳述句為:(因未對輸入的引數進行過濾)Select * from products where productid=1;DELETE FROM products當執行查詢后,第一條顯示查詢資訊,第二條則將整個表進行洗掉,- 堆疊注入的局限性在于并不是每一個環境下都可以執行,可能受到API或者資料庫引擎不支持的限制,(也就是說有的時候并不適合,那適合union 的時候適不適合堆疊?)當然了權限不足的問題也可以解釋為什么攻擊者無法修改資料或者呼叫一些程式,
既然堆疊可以使用任意陳述句進行執行,那首先學習幾個常用的在庫中的陳述句,
show databases;顯示資料庫串列,
show tables;顯示當前查詢的表,
desc words;獲取表結構,
show columns from words;獲取表結構,
alter table t1 rename t2;重命名表名,
alter table words change 欄位名 新欄位名 varchar(100)型別;重命名欄位名,
查看所有表名,發現只有1919810931114514和words表,

查看words表結構,

查看1919810931114514表結構,

根據查詢資料的結構可知,現在使用的是words表,而flag在1919810931114514表中,
array(2) {
[0]=>
string(1) "1"
[1]=>
string(7) "hahahah"
}
到這里其實思路比較明亮,就是要查表中flag欄位的值,但是select等關鍵字被禁用,各路前輩也提供了不同的思路來解決,
- 一是Lee-404 師傅預定SQL查詢,
PREPARE name from '[my sql sequece]'; //預定義SQL陳述句
EXECUTE name; //執行預定義SQL陳述句
(DEALLOCATE || DROP) PREPARE name; //洗掉預定義SQL陳述句
char()
cancat() //連接字符
char(115,101,108,101,99,116) -->SELECT
最后payload為1';PREPARE name from concat(char(115,101,108,101,99,116),'* from `1919810931114514`');EXECUTE name;#(純數字的表名要加反引`號)
- 二是Art_Dillon師傅修改默認查詢的表,
預知識為修改表、列名,
rename tables words to words1;修改表名,
alter table words change flag id varchar(100);修改表中列名,
最終payload為1 ' or 1=1; rename tables words to words1;rename tables `1919810931114514` to words;alter table words change flag id varchar(100);#執行成功后,需再次1' or 1=1;#查詢所有列資訊,

小結
經過近幾天題目的練習發現自己對于很多知識都有所欠缺,也正是希望通過練習題目的方式查找自己存在的不足,列下內容,進行逐一學習,下步將對上面所提到的弱型別md5碰撞、php偽協議、反序列化、模板注入(SSTI)等進行學習,
將基礎學習補上之后繼續刷題,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292643.html
標籤:其他
上一篇:內網后滲透,生成免殺后門!!
