buuctf-web-6
[GXYCTF2019]BabySQli1–union select特性
[BUUCTF 2018]Online Tool–绕过escapeshellarg、escapeshellcmd
[强网杯 2019]高明的黑客–shell脚本筛查
[RoarCTF 2019]Easy Java–WEB-INF配置文件
[GXYCTF2019]BabySQli1
随便输入试试
根据提示不同,可以看到确实是存在admin用户的,
尝试一下注入,开始的时候在pw字段进行注入,但是尝试了很多之后,都提示wrong pass
在name字段进行测试,
发送name=admin’发现有报错,
name=admin’的话,提示wrong usr,
所以,应该是单引号字符型注入,尝试了
name=admin’+and+0#&pw=1 报错wrong usr
name=admin’+and+1#&pw=1 报错wrong pass
and语句被执行了,尝试or,发现or被过滤了,但是Or可以绕过,所以接下来使用Order by来探测列数,发现有三列
接下来使用联合注入,发现括号被过滤了,,,,,,那该怎么办
不会做了,只能百度了。。。。。。
看了wp之后,发现是要利用sql语句的特性:在联合查询并不存在的数据时,联合查询就会构造一个虚拟的数据。
构造payload
name=1’+union+select+1,’admin’,’123’#&pw=123
但是还是提示wrong pass
原来是因为,数据库中存储的是MD5,所以要把123的MD5值存进去,
name=1’+union+select+1,’admin’,’202cb962ac59075b964b07152d234b70’#&pw=123
[BUUCTF 2018]Online Tool
打开题目,直接给出源码,代码审计
这里涉及到两个函数,具体使用方法如下:
escapeshellarg — 把字符串转码为可以在shell命令里使用的参数
escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入shell函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell函数包含 exec(), system() 执行运算符 。
1.确保用户只传递一个参数给命令
2.用户不能指定更多的参数
3.用户不能执行不同的命令
escapeshellcmd — shell 元字符转义
escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。
反斜线(\)会在以下字符之前插入: &#;`|*?~<>^()[]{}$, \x0A 和 \xFF。 ‘ 和 “ 仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及 % 和 ! 字符都会被空格代替。
1.确保用户只执行一个命令
2.用户可以指定不限数量的参数
3.用户不能执行不同的命令
这两个函数在一起用会有些问题
传入的参数是:172.17.0.2’ -v -d a=1,经过escapeshellarg处理后变成了’172.17.0.2’'‘ -v -d a=1’,即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。
经过escapeshellcmd处理后变成’172.17.0.2’\‘’ -v -d a=1',这是因为escapeshellcmd对\以及最后那个不配对儿的引号进行了转义:http://php.net/manual/zh/function.escapeshellcmd.php
最后执行的命令是curl ‘172.17.0.2’\‘’ -v -d a=1',由于中间的\被解释为\而不再是转义字符,所以它后面的’没有被转义,与再后面的’配对儿成了一个空白连接符。所以可以简化为curl 172.17.0.2\ -v -d a=1’,即向172.17.0.2\发起请求,POST 数据为a=1’。
简单的来说就是两次转译后出现了问题,没有考虑到单引号的问题,然后往下看,看到echo system(“nmap -T5 -sT -Pn –host-timeout 2 -F “.$host);这有个system来执行命令,而且有传参,肯定是利用这里了。
这里代码的本意是希望我们输入ip这样的参数做一个扫描,通过上面的两个函数来进行规则过滤转译,我们的输入会被单引号引起来,但是因为我们看到了上面的漏洞所以我们可以逃脱这个引号的束缚
这里常见的命令后注入操作如 | & &&都不行,虽然我们通过上面的操作逃过了单引号,但escapeshellcmd会对这些特殊符号前面加上\来转移…
这时候就只有想想能不能利用nmap来做些什么了。
这时候搜索可以发现在nmap命令中 有一个参数-oG可以实现将命令和结果写到文件。
这个命令就是我们的输入可控!然后写入到文件!OK很自然的想到了上传一个一句话木马了
?host=’ -oG shell.php ‘
在上面的源码中可以看到,提交之后会返回创建并返回一个文件夹的名称,我们生成的木马就在这个目录下,尝试访问
写入木马:?host=’ -oG shell.php ‘
蚁剑连接:
测试这两个函数的作用:
‘ -oG shell.php ‘
‘’'‘ -oG shell.php ‘'‘’
‘’\‘’ <?php phpinfo();?> -oG shell.php ‘\‘’’
执行命令时:\ -oG shell.php \
注意payload中:没有空格和引号都是不行的。
[强网杯 2019]高明的黑客
看到说源码备份到了www.tar.gz,访问一下,下载下来
解压之后就很奇怪了,有2000多个文件,
随便打开一个看看
可以看到有很多shell,但是看起来都不能使用,但是这些shell中应该有可以使用的,因为文件数量太大,需要写脚本筛查(大佬的脚本)。
1 | #encoding=utf-8 |
找到之后payload:
[http://da91d275-8eeb-4b60-bf11-81cdbc3f629b.node3.buuoj.cn/xk0SzyKwfzw.php?Efa5BVG=cat%20/flag](http://da91d275-8eeb-4b60-bf11-81cdbc3f629b.node3.buuoj.cn/xk0SzyKwfzw.php?Efa5BVG=cat /flag)
[RoarCTF 2019]Easy Java
打开题目是一个登录界面
但是我们不知道用户名和密码,但是有个帮助,点击之后
似乎是文件包含,尝试读取/etc/passwd
没有读取到,
百度一下java.io.FileNotFoundException:{help.docx},说这个是报错,是因为找不到文件路径的问题。但是这里不知道怎么解决,看了wp之后,说是,看到java.io.FileNotFoundException:{help.docx}这个报错,就是要切换请求方式。。。。。。挺迷的,这里是把get变成post。
有个pk文件,应该是可以下载的
就这吗?
尝试一下包含其他文件,
出现了报错信息
查看了wp
是考察WEB-INF/web.xml泄露
WEB-INF主要包含一下文件或目录:
/WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。
/WEB-INF/classes/:含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中
/WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件
/WEB-INF/src/:源码目录,按照包名结构放置各个java文件。
/WEB-INF/database.properties:数据库配置文件
漏洞检测以及利用方法:通过找到web.xml文件,推断class文件的路径,最后直接class文件,在通过反编译class文件,得到网站源码
漏洞成因:
通常一些web应用我们会使用多个web服务器搭配使用,解决其中的一个web服务器的性能缺陷以及做均衡负载的优点和完成一些分层结构的安全策略等。在使用这种架构的时候,由于对静态资源的目录或文件的映射配置不当,可能会引发一些的安全问题,导致web.xml等文件能够被读取。漏洞检测以及利用方法:通过找到web.xml文件,推断class文件的路径,最后直接class文件,在通过反编译class文件,得到网站源码。一般情况,jsp引擎默认都是禁止访问WEB-INF目录的,Nginx 配合Tomcat做均衡负载或集群等情况时,问题原因其实很简单,Nginx不会去考虑配置其他类型引擎(Nginx不是jsp引擎)导致的安全问题而引入到自身的安全规范中来(这样耦合性太高了),修改Nginx配置文件禁止访问WEB-INF目录就好了: location ~ ^/WEB-INF/* { deny all; } 或者return 404; 或者其他!
接下来我们还是用post的方法,访问WEB-INF/web.xml
将com.wm.ctf.FlagController转化格式,变成WEB-INF/classes/com/wm/ctf/FlagController.class
Payload: Download?filename=WEB-INF/classes/com/wm/ctf/FlagController.class
将base64解码之后,