1、[极客大挑战 2019]Http1
1.http报文请求:
1、请求行:
第一部分是请求方法,常见包括GET、POST、OPTIONS(我目前还没有见过我是菜鸡)
第二部分是url
第三部分是HTTP协议(http(Hypertext transfer protocol)超文本传输协议,通过浏览器和服务器进行数据交互,进行超文本(文本、图片、视频等)传输的规定。也就是说,http协议规定了超文本传输所要遵守的规则。)
2、请求头
1、Host:接受请求的服务器地址,可以是IP:端口号,也可以是域名
2、User-Agent:发送请求的应用程序名称
3、Accept: 表示客户端可以接受的内容类型,多个值使用;分号隔开q=0.9 表示权重优先级,*/*表示可以接受任意类型内容
4、Accept-Language:通知服务器可以发送的语言
5、Accept-Encoding:通知服务端可以发送的数据压缩格式
6、Content-Type:表单提交时才有可能出现,表示表单的数据类型,使用url编码,url编码 % 16位数
7、Upgrade-Insecure-Requests:告诉服务器,浏览器可以处理https协议
8、请求头结束后有一个空行,与请求体进行分隔
3、请求体
2.解题:
GET没有请求体,POST有请求体
打开题目首先查看源代码,发现了一个secret.php,
打开看一下,发现有限制(考察http报文请求)
因此考虑抓包后改包上传,在请求头中加入Rferer:
显示使用“Syclover”浏览器,把User-Agent中的Firefox/125.0改成Syclover
显示只能用本地查看,添加X-Forwarded-For: 127.0.0.1后放包,得到flag
2、[极客大挑战 2019]Knife1
打开题目发现一个一句话木马,考虑蚁剑链接找flag
连接成功,找到flag
3、[ACTF2020 新生赛]BackupFile1
打开题目发现提示只有查看源码,但是根据题目提示BackupFile备份文件,考虑尝试找到备份文件。
常见的备份文件后缀名有 .git .svn .swp .~ .bak .bash_history
尝试后发现此题输入index.php.bak是找到文件。
is_numeric() 函数用于检测变量是否为数字或数字字符串。
语法
bool is_numeric ( mixed $var )参数说明:
- $var:要检测的变量。
返回值
如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回 1,即 TRUE。
intval() 函数可以获取变量的「整数值」。常用于强制类型转换。
语法
int intval( $var, $base )
参数
$var:需要转换成 integer 的「变量」
$base:转换所使用的「进制」返回值
返回值为 integer 类型,可能是 0 或 1 或 其他integer 值。
0:失败 或 空array 返回 0
1:非空array 返回 1
其他integer值:成功时 返回 $var 的 integer 值。返回值的「最大值」取决于系统
32 位系统(-2147483648 到 2147483647)
64 位系统(-9223372036854775808到9223372036854775807)
题目要求传入参数key,key的值只能是数并和key的值进行比较,这里涉及php弱比较
php的弱比较:
- === 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较
- == 在进行比较的时候,会先将字符串类型转化成相同,再比较
因此构造payload:key=123
4、[RoarCTF 2019]Easy Calc1
打开题目发现一个输入框,想到了sql注入,用1'测试注入时发现框内仅可识别数字,查看源码
在url中发现一个传输数据的calc.php文件,尝试打开
这里需要空格绕过waf,PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:
1.删除空白符
2.将某些字符转换为下划线(包括空格)
因此可以将上传num前加一个“ ”,这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样代码还能正常运行,还上传了非法字符。于是参考[RoarCTF 2019]Easy Calc 构造payload:
calc.php? num=2;var_dump(scandir(chr(47)))
扫根目录下的所有文件,也就是scandir("/"),因为/被过滤就改为chr(47)
scandir() 函数用于获取指定目录中的文件和文件夹列表。它接受一个路径作为参数,并返回一个包含指定目录中所有文件和文件夹的数组。scandir(".") 表示获取当前目录下的文件列表。
var_dump() 函数将该列表输出到页面上。
chr(47)是“/”的ASCII编码。
找到一个"f1agg",猜想与flag有关,尝试查看其内容
calc.php?num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
file_get_contents() 函数是用于将文件的内容读入到一个字符串中的首选方法;
chr(47)是/的ASCII编码;
chr(102)是f的ASCII编码;
chr(49)是1的ASCII编码;
chr(97)是a的ASCII编码;
chr(103)是g的ASCII编码。
5、[极客大挑战 2019]BuyFlag1
打开题目在菜单中找到与buyflag相关的提示
提示说只有cuit的学生可以购买,同时还需要正确的密码。尝试查看源码找跟多的信息。
发现有is_numeric() 函数,判断其中的参数是数字还是其他,如果是数字则判断为真,否则为假
同时还存在一个php弱类型比较,如果$password==404则可以绕过。用password==404aaa绕过,因为题目还有身份验证,考虑抓包
cookie的值看起来值得思考,尝试修改后看有什么变化
发现现在身份验证和密码都是对的,可以开始支付了题目中说:Flag need your 100000000 money,尝试上传money,显示上传数字过长,想到了可以用科学计数法绕过,e表示10,e后面的数字表示次方,100000000表示为1e8,尝试输入money=1e8后提示money不够。尝试1e9
6、[BJDCTF2020]Easy MD5 1
打开题目只有一个输入框,查看源码发现没有信息后尝试抓包,在输入框任意输入后尝试转包发现hint
“select * from 'admin' where password=md5($pass,true)”,sql会将传入的$pass在进行md5哈希后 在‘admin’表中匹配是否有与其相等的值。其中利用散列函数md5加密了password因为传参进行了md5加密,所以普通输入的SQL语句:or 1 ;这是不会被解析执行的。所以得想一个当输入进去的值能被md5加密解析成 or 语句,查看资料发现万能密码ffifdyop
ffifdyop:
ffifdyop经过md5加密后为:276f722736c95d99e921722cf9ed621c
再转换为字符串:'or’6<乱码> 即 'or’66�]��!r,��b
select * from 'admin' where password=md5($pass,true)
在php中md5中的第二个参数不填默认是no,也可以填入yes
当第二个参数为no时返回的是一个十六进制字符串
当第二个参数为yes时返回的是二进制字符串(也就是16字符串转ascii码字符串)
绕过原理是:ffifdyop
这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c
,这个字符串前几位刚好是 ' or '6
而 Mysql 刚好又会把 hex 转成 ascii 解释,因此拼接之后的形式是 select * from 'admin' where password='' or '6xxxxx'
,等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数
输入ffifdyop后,跳转到新页面,查看源码发现一个弱比较
方法一:0e绕过
PHP在处理字符串时会出现缺陷,可能将一些向科学计数法的字符串误判为科学记数法,导致其使用科学计数法的计算方式。因此md5加密后的哈希值第一位为0,第二位为e,后面不论是什么都认为和0相等,一下几个字符串经过md5函数后开头都为0e
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
构造payload:?a=QNKCDZO&b=240610708
方法二:数组绕过
无论是PHP弱比较还是强比较,md5()函数无法处理数组,如果传入的是数组,会返回NULL,两个数组经过加密后返回值均为NULL,形成相等。
构造payload:?a[]=1&b[]=2
之后得到此页面,包含MD5强碰撞,要求与之前一样,需要两个参数的值不同但MD5转换后相同。强碰撞只能用数组绕过。
构造payload: param1[]=1¶m2[]=2
ffifdyop原理:https://www.cnblogs.com/redfish404/articles/17878453.html