Ctf实验吧 --web(学习笔记 未完成)

Ctf实验吧 --web (作为自己的学习笔记)
用于学习交流 希望有不足或错误的地方能提出来
(第一次写博客,直接从word复制过来 图片 文字格式什么的都没有了 有点可惜~有时间再进行修改吧 最近要比赛了啊)

Ctf实验吧 --web
做完前几个题发现整个人都枯了 不过这些题都特别的有用 而且学到了很多东西
作为初学者的我 受益匪浅啊
首先第一个题就给小白下了一个大的马威

简单的登录题 (这个题一点也不简单!)有时间再搞吧
这个题差点让我直接弃游~是的 真、男上加男
参考过别人的wp
这个题主要是靠的CBC翻转与sql注入
好的CBC 刚考完三级 还是有那么一点了解的
Iv 密文等字眼在书中看了很多~关于CBC这一块
况且这个题竟然还要tm写脚本
好的 对于脚本不怎么熟悉的我 还是打算先搁置了~

后台登录

这个题看到后台两字,我们直接采用web常用手段,源代码,御剑走起来
御剑没扫出什么东西来,倒是在源代码中发现了一些猫腻~
password = ‘".md5($password,true)."’
md5()函数有两个参数,一个是要加密的字符串,另一个是输出格式,具体是

raw 可选。规定十六进制或二进制输出格式:
TRUE - 原始 16 字符二进制格式
FALSE - 默认。32 字符十六进制数

查看了别人的wp这个题考的是MD5加密绕过了
主要目的是构造出or语句 并且在or两边要有单引号
使它变成password=‘xxx’ or 'xxx’的形式
引用实验吧 留言的一句话根据md5($password,true)最后要得到原始二进制字符串,要含有or ,在or的两边要有单引号,使它变成password=‘xxx’ or 'xxx’的形式,那么可以根据32位16进制的字符串来查找‘or’对应的16进制是276f7227,所以我们的目标就是要找一个字符串取32位16进制的md5值里带有276f7227这个字段的,在276f7227这个字段后面紧跟一个数字,除了0,1-9,对应的asc码值是49-57,转化为16进制就是31-39,也就是含有276f7227+(31-39)这个字段,就可以满足要求。
而276f722736c95d99e921722cf9ed621c 正是ffifdyop的md5转义
再转换成字符串 'or’6
存在 or 即代码的两边有一边为真既可以绕过,其实为垃圾代码没有任何用的。

该题为初学者提供了一个常见的MD5sql注入代码ffifdyop

此外这个题输入e58也可以 (跟着楼下的大佬学了很多东西啊)
引用大佬的md5(‘e58’) 是形如 xxx’-'xxx 的字符串。password = ‘xxx’-'xxx’右边为两个字符串相减,会转换为0-0,结果为0,左边password与数值比较也会被转换为0

加了料的报错注入

(对https://blog.csdn.net/taozijun/article/details/80400053进行补充)
嗯 这个题直接提示了 首先打开hackbar 采用post提交
我们直接试试提交admin 好的不行(那肯定不行啊)
题目写的很明白 报错注入
这个题肯定是要用sql注入了
常规的一般不行 什么and 1=2啊 这些都会被过滤 并提示 sql injection detected
参考了别人的wp
主要有几个关键点
extractvalue(目标xml文档,xml路径)
参考这一篇文章
https://blog.csdn.net/zpy1998zpy/article/details/80631036
读完之后 发现这个题很好理解了
/**/注释
‘or or’这样前后闭合
(小白有点懵 我试着去掉最后一个or’ 是无法成功注入的
看到最后有一个单引号 想想是为了和前面的’闭合吧
试着去掉or 发现并不成功 我的猜想错了吗? 求教大佬!!
所以这算是一种套路吗?)

“=”被过滤 采用regexp() 的绕过 (get到了新姿势)

参考extractvalue这个函数我们大致可以构造出如下的payload

后面的爆数据熟悉的不能再熟悉了 往下看在爆的时候有一个需要注意的地方

爆数据库得到error_based_hpf

爆表
username=admin’ or extractvalue/&password=admin/(1,concat(’~’,(select group_concat(table_name) from information_schema.tables where table_schema regexp database()),’~’)) or’

(后面的~可以去掉 这里是为了方便查看 但前面的并不可以 因为去掉之后 没有语法错误,不会报错 这里是参考extractvalue)

得到表’ffll44jj’

爆列
select group_concat(column_name) from information_schema.columns where table_name regexp ‘ffll44jj’

爆数据
select group_concat(value) frommhj weafbnmhjk. error_based_hpf.ffll44jj

得flag
XPATH syntax error: ‘flag{err0r_b4sed_sqli_+_hpf}

认真一点(这个题对小白还是有点难度啊~)

总结一下所看的wp
其中一条wp下的评论算是点睛之笔了
Mid(str,pos,len)和substring(str,pos,len)差不多
括号内的内容可以换成string from pos for len也是可行的
并且我觉得更加好理解
并且应证了我上一个题的猜想
0’or or’0这个题过滤了or采用oorr或者大写进行绕过~

这个题还教给了我一个东西 大概知道了脚本如何去写~
request.post request.get 参数的不同
Post为data; get为header

然后直接上脚本跑吧 网上的wp都有

你真的会php吗

一看题目感觉是php审计
打开题目 进去查看源代码 什么都没有
打开开发者工具 看一下头有没有什么信息 或者用bp抓包吧
经过一番寻找后 get
好的 打开~没错 确实是一道php审计题
我们直接看flag需要怎么样才能打出来

源码前面定义了一些函数~我们倒着往上看怎么得到flag
首先是不满足函数is_palindrome_number的num
这个函数是判断数是否为回文数
什么是回文数呢(如12321 123454321这样的数 正反都一样)

需要value1=value2
Value1=num Value2=反转后的num
然后呢 num不能是一个数字,需要是整数
怎么去绕过呢~
%00或者%20是可以绕过is_numeric函数
解决了第一个问题了 就直接输入一个整数加入%00就过了两道坎了
接下来是出题人给初学者又好好上了一课·~
intval溢出
intval最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。举例,在这样的系统上, intval(‘1000000000000’) 会返回 2147483647。64 位系统上,最大带符号的 integer 值是 9223372036854775807。

当我们输入intval :2147483647最大值时 反转过来 7463847412 溢出了所以会自动变成2147483647这个数了~
而且2147483647也不是回文数 那么就over了
最后注意一下post提交number就可以了
http://ctf5.shiyanbar.com/web/PHP/index.php?综上我们就可以得到flag了~

####0x02科学记数法绕过
因为要求不能为回文数,但又要满足intval(req[“number”])=intval(strrev( req[“number”])=intval(strrev(req[“number”])=intval(strrev(req[“number”])),所以我们采用科学计数法构造poc为number=0e-0%00,这样的话我们就可以绕过。
一定要时-0,才不会被判定为回文数(学到了!!!)

参考https://blog.csdn.net/he_and/article/details/80615920

登录一下好吗(看万能密码原理)

简单的sql注入之2

试着随便输个1’ 报了个语法错误
试着输入1’ and ‘1’=1 被检测到了
换一下 1’and‘1’=’1 正常回显了 过滤了空格
那可以采用//来进行绕过
1’/
/union//select//schema_name//from//information_schema.schemata//where//‘1’='1查数据库
同理手工得flag~

简单的sql注入之1

采取和2一样的
这个题查所有数据库、表时没什么问题
当查看所有列时
回显near ‘from////where/**/‘1’=‘1’’ at line 1

看来是进行了过滤 采用information_schema.columninformation_schema.columns
仍然报错 估计前面column_name也进行了过滤 同样采取一样的方法绕过
得到column flag
1’//union//select//flag//from//flag//where/**/‘1’='1
得到flag~~

天下武功唯快不破

由题~~唯快不破(感觉高中做题一样)
就是写脚本吧~
打开 好的 果然是让你快点
但没什么信息 查看源代码没什么东西
开发者工具看下头 找到了flag 估计是base64编码

写个脚本即可

FORMS

破解pin码?

查看了源代码 头都没看到有什么可用的东西
随便输入几个数 试试抓包看
看到提交的数据不仅有pin还有showsource
查看了别人的wp 发现只需要改一下值就可以了(身为小白的我学到了 翻译过来意思是 显示源码? 应该是吧 把0改成1之后看到了源代码)
然后提交a值就得到flag了

忘记密码了
先随便输入一点东西吧 弹出一个
复制url我们看看 闪了一下然后弹回来step1

查看下源代码吧 看到了一个管理者邮箱?

我们试着输入显示这一坨~好吧 没什么办法
好像走到了死胡同?
我们看一下最开始的弹窗 抓包查看下它的源代码 或者直接修改url
看到表单上传到submit.php
我们打开看看回显这个
好吧 我们再看看源代码的其他信息
好吧 在邮箱下面遗漏了一个关键的东西vim
查看别人的wp 学到东西了
如果未正常关闭 会留有一个后缀名.swp的隐藏文件
并且需要在文件名前加 .
好吧是php审计题
传入token 和 emailaddress

看一下条件 token长度必须为10 而且要等于0
简单的科学计数法~0e00000000
地址提交管理员地址
就可以得到flag了

ONCE MORE

好吧题目直接说了 php审计
Ereg()函数漏洞 科学方法算数?
先不管了 打开先查看源码吧

传入password 只能输入字母和数字
题目提示了 科学计数法
password大于9999999 长度要小于8
并且password要含有*-*
题目提示了Ereg有漏洞 百度了一下
可以用%00绕过
所以综上就password=1e9%00*-*
需要注意的是要在地址栏输入 否则为空
得到flag~~
Guess Next Session
打开看源码 看如何得到flag

看了别人的wp学到了东西
随便输一点什么 抓包试试
比较简单
把phpsessid删掉然后把password的值删掉就可以得到flag
但主要是给初学者提供了一种思路

Cookie与 Session,一般都会认为这是两个独立完全不同的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。在PHP配置中的默认情况下,Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session了。

参考https://blog.csdn.net/raalghul/article/details/79028473

False

Md5碰撞?
查看源码 看如何得到flag呢
1.传入name,password的值
2.name和password的值不能相等
3.name和password的sha1加密散列值相等
sha1()函数默认的传入参数类型是字符串型,可以传入其他类型,使其返回值为false。如数组类型
当sha1函数的参数是数组时,sha1会返回false,我们构造的URL中,name和password都是数组,所以它们的sha1值都是false,这里我们就巧妙的运用了sha1函数的漏洞使得两个值的sha1值相同。
所以构造name[]=1&password[]=2就可以了
就可以得到flag了

上传绕过0x00截断上传?
(掌握burpsuite的00截断技术呢)
随便上传一个文件 告诉我上传图片
上传图片后呢 又告诉我必须是php后缀呢
所以完全不会 看了别人的wp
这个题又学了东西 闻所未闻~身为小白的我一脸懵逼
说是抓包后 在加上一个以php为后缀的文件
如(+1.php或者1.php+ 我最开始用的第一个发现也可以
回头才注意到wp里是加在后面的 好像没什么影响?)
再修改hex文件 把+对应的值改成00 进行绕过~
学到了但很懵逼 可能就是这样操作绕过的吧 没有什么原因
但我还是想要知道是什么原理呢~~
然后go就得到flag了~

NSCTF Web200

这个题是真题 难度系数果然不同~
传入str 看到一些哇~新人劝退
默默打开wp
其实慢慢看 还是很容易理解的
需要一步一步来慢慢分析
不要被很相似的参数所迷惑感到困难而劝退

好吧接下来我们来蛋疼的分析1
看如何得到flag 即 如何加密得到的这一串密文

我们倒着看吧 首先把这个$_看成1
先base64解码 再反转 再rot13解密 (ROT13是它自己本身的逆反;也就是说,要还原ROT13,套用加密同样的算法即可得。)
好的我们错了这里 查看别人的wp
是先rot13解密 再反转 最后base64解密
这是for循环外的
接下来看里面
看一下变量1在哪里出现了发现是在最后面 我们依然倒着看
$_c 看成2 最后一步是 变量1和2拼接在一起了
KaTeX parse error: Expected group after '_' at position 1: _̲_看成3 变量2由变量3 c…_c看成变量4吧
3由最开始的4的(ascii码值+1)得来的
ord() 函数返回字符串的首个字符的 ASCII 值。
$_o看成5 $_0看成6
好的 所有变量分配完了
接下来继续分析
4是由5 和6一起来的
substr(string,start,length)
参数 描述
string 必需。规定要返回其中一部分的字符串。
start 必需。规定在字符串的何处开始。
正数 - 在字符串的指定位置开始
负数 - 在从字符串结尾开始的指定位置开始
0 - 在字符串中的第一个字符处开始

length 可选。规定被返回字符串的长度。默认是直到字符串的结尾。
正数 - 从 start 参数所在的位置返回的长度
负数 - 从字符串末端返回的长度

$4=substr($6,$5,1)
0 - 在字符串中的第一个字符处开始
就是从变量6第一个字符开始 返回第一个字符
然后每个字符再进行前面所说的一系列操作
就得到最终的变量1
变量6又是怎么来的呢
就是我们所传入str的值反转

For里面的判断理解 很好理解了 学过c应该还是有点记忆的
就解释成将变量中的字符一个一个的去操作吧~

综上代码如下

<?php
	$str="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
	    $str=str_rot13($str);
	    $str=strrev($str);
	    $str=base64_decode($str);
	    echo $str;
	    #接下来的for循环判断仿照题目中的就可以了
	    $res=" ";  #这里要加上定义否则要报错
	    for($_0=0;$_0<strlen($str);$_0++)   #这里直接仿照题目
	    {
	        $_c=substr($str,$_0,1);
	        $__=ord($_c)-1;
	        $_c=chr($__);
	        $res=$res.$_c;    #最开时报错了 因为没有定义 在前面加上定义
	    }
	    #最后反转一下
	    $res=strrev($res);
	    echo "\n";  #输出给自己看   <br>是在浏览器上显示  \n的单引号不“解释”
	    echo $res;
?>

参考https://blog.csdn.net/raalghul/article/details/78925042

PHP大法

题目告诉 注意备份文件
打开看到
用御剑扫了一下 看下有没有备份文件
好吧 并没有那题目告诉是什么意思呢
打开index.php.txt 看到源码
想要得到flag 传入id为hackerDJ即可
查看源码urlencode(hackerDJ)加入url
Get提交 发现并没有得到flag 看来是自动解码了
所以我们在encode一次 就可以得到flag了
这里交给初学者web会自动解码一次
这里需要两次encode就可以了
综上~~~double encode(hackerDJ) 得flag

头有点大

这个题主要是给初学者讲在bp里改头的操作
看了wp才学会 怎么添加.net framework 9.9这个头
英格兰百度就能找到对应en-gb
即在user-agent的括号内添加 .NET CLR 9.9这个
将Accept-language改为en-gb即可
浏览器头不加没什么影响依然能得到flag
但别人都写了 也算是学东西吧
同样在user-agent加入compatible; MSIE 6.0
参考https://blog.csdn.net/raalghul/article/details/78782147

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值