ctfshow 萌新赛 给她

ctfshow 萌新赛 给她_第1张图片

初识: 一开始看到这个题目以为是sql注入,尝试了各种sql注入转义次都注入不了

.git泄露:最后还是看了一下大佬的解题,发现方向就错了,“给她”——“git”,这题的入口是.git泄露。

我是纯小白,看到这又去了解了一次啊.git泄露,有个大佬写得非常详细

https://blog.csdn.net/qq_45521281/article/details/105767428

GitHack下载地址:https://github.com/lijiejie/GitHack

使用: 找到下载目录输入 python GitHack.py https://xxxxxxxxxxxxx/.git/

python2 GitHack.py https://xxxxxxxxxxxxx/.git/为ctfshow给她 赛题的url

打开hint.php

ctfshow 萌新赛 给她_第2张图片

 sprintf漏洞

 https://blog.csdn.net/WQ_BCJ/article/details/85057447

https://blog.csdn.net/alex_bean/article/details/102721959

通过底层实现代码可以发现,sprintf()方法就是对15种类型做了匹配,15种类型以外的就直接break了没有做任何处理,所以就会导致一个问题:

如果我们输入"%\"或者"%1$\",他会把反斜杠当做格式化字符的类型,然而找不到匹配的项那么"%\","%1$\"就因为没有经过任何处理而被替换为空。如果%1$ + 非arg格式类型,程序会无法识别占位符类型,变为空

因此sprintf注入的原理就是用一个15种类型之外的"\" 来代替格式字符类型让函数替换为空,则“%1$\'”后面的单引号就能闭合前面的单引号。

此外,还要注意函数addslashes()作用是返回在预定义字符之前添加反斜杠的字符串。预定义字符是单引号(')双引号(")反斜杠(\)NULL。比如下图,这样就造成了得结果是我们无法在注入的过程当中使用单引号(’)

ctfshow 萌新赛 给她_第3张图片

ctfshow 萌新赛 给她_第4张图片 

举一个例子


';
$sql = sprintf ("SELECT * FROM t WHERE a='%s' $b ", 'admin' );
//对$input与$b进行了拼接
//$sql = sprintf ("SELECT * FROM t WHERE a='%s' AND b='%1$\' and 1=1#' ", 'admin' );
//很明显,这个句子里面的\是由addsashes为了转义单引号而加上的,使用%s与%1$\类匹配admin,那么admin只会出现在%s里,%1$\为空
echo  $sql ;
?>

 输出:

那么这里要构造%1$ + 非arg格式类型,1是因为%数量大于arg数量

?name='admin'&pass=123%1$' or 1=1--+

addslashes()将'转义成\' 则passpass=123%1$\'

最后$sql为

select * from user where name='admin' and pass='123' or 1=1--+'

 来到了这个页面ctfshow 萌新赛 给她_第5张图片

 查看源码

ctfshow 萌新赛 给她_第6张图片

flag就在这个页面

抓个包

ctfshow 萌新赛 给她_第7张图片

cookie中发现奇怪的地方,解码看看

ctfshow 萌新赛 给她_第8张图片 

 尝试用php伪协议

ctfshow 萌新赛 给她_第9张图片

ctfshow 萌新赛 给她_第10张图片

没有显示

ctfshow 萌新赛 给她_第11张图片 

 使file=/flag

ctfshow 萌新赛 给她_第12张图片

 得到flag

ctfshow{4ef5edb8-d547-4400-9759-9027180b531f}

 萌新赛真难!!!

 

 

你可能感兴趣的:(ctf,ctf,ctfshow)