WEB日常刷题练习(1)
js
题目描述:JavaScrip代码审计,flag{}
题目难度:初级
存在一个js页面
- 创建了一个表单元素,包含:
- 用户名输入框(默认提示文字 "Username")
- 密码输入框(默认提示文字 "Password")
- 登录按钮
- 输入框有焦点和失焦事件:
- 获得焦点时清空默认提示文字
- 失去焦点时恢复默认提示文字(如果为空)
- 登录按钮的点击事件包含验证逻辑:
- 检查用户名和密码是否为空
- 如果为空则显示相应提示
- 否则执行一段加密 / 验证逻辑
- 代码中包含多个可疑字符串和加密密钥,如:
- "JaVa3C41ptIsAGo0DStAff"
- "CaNUknOWThIsK3y"
- "Java_Scr1pt_Pa4sW0rd_K3y_H3re"
对网站的这些代码进行格式化,eval函数改为alert
然后F12丢进去执行一下
得到以下js:
var strKey1 = “JaVa3C41ptIsAGo0DStAff”; var strKey2 = “CaNUknOWThIsK3y”; var strKey3 = String.fromCharCode(71, 48, 111, 100, 33); if (uname == (strKey3 + (((strKey1.toLowerCase()).substring(0, strKey1.indexOf(“0”)) + strKey2.substring(2, 6)).toUpperCase()).substring(0, 15))) { var strKey4 = ‘Java_Scr1pt_Pa4sW0rd_K3y_H3re’; if (upass == (strKey4.substring(strKey4.indexOf(‘1’, 5), strKey4.length - strKey4.indexOf(’’) + 5))) { alert(‘Login Success!’); document.getElementById(‘key’).innerHTML = unescape("%3Cfont%20color%3D%22%23000%22%3Ea2V5X0NoM2NrXy50eHQ=%3C/font%3E"); } else { alert(‘Password Error!’); } } else { alert(‘Login Failed!’); |
- 定义了四个密钥字符串:
- strKey1 为固定字符串 "JaVa3C41ptIsAGo0DStAff"
- strKey2 为固定字符串 "CaNUknOWThIsK3y"
- strKey3 通过字符编码转换得到(71,48,111,100,33 对应 "Good!")
- strKey4 为固定字符串 "Java_Scr1pt_Pa4sW0rd_K3y_H3re"
- 用户名验证逻辑:
- 对 strKey1 进行小写处理
- 截取到第一个 "0" 出现的位置
- 拼接 strKey2 从第 2 位到第 6 位的字符
- 转换为大写后截取前 15 位
- 与 strKey3 拼接得到最终的有效用户名
- 将输入的 uname 与计算出的有效用户名进行比对
- 密码验证逻辑:
- 在 strKey4 中从位置 5 开始查找第一个 "1"
- 计算截取范围并得到有效密码
- 将输入的 upass 与计算出的有效密码进行比对
- 验证结果处理:
- 用户名和密码都正确时,弹出 "Login Success!" 提示,并在 id 为 "key" 的元素中显示一段经过 unescape 解码的内容(实际是一个包含 "a2V5X0NoM2NrXy50eHQ=" 的字体标签)
- 密码错误时,弹出 "Password Error!" 提示
- 用户名错误时,弹出 "Login Failed!" 提示
计算有效的用户名
- strKey3 的值:通过 String.fromCharCode(71, 48, 111, 100, 33) 转换得到 "Good!"
- strKey1 小写处理:"java3c41ptisago0dstaff"
- 截取到第一个 "0" 出现的位置:"java3c41ptisago"
- strKey2 截取第 2-6 位:"UKNOW"(原字符串 "CaNUknOWThIsK3y" 从索引 2 开始取 5 个字符)
最终有效的用户名为:G0od!JAVA3C41PTISAGO
计算有效的密码
- strKey4 为 "Java_Scr1pt_Pa4sW0rd_K3y_H3re"
- 查找从位置 5 开始的第一个 "1":在索引 7 的位置
- 计算截取范围:从索引 7 开始到字符串末尾
- 截取结果:"1pt_Pa4sW0rd_K3y_H3re"
最终有效的密码为:1pt_Pa4sW0rd_K3y_H3re
然后访问 http://3.1.1.1/key_Ch3ck_.txt
直接访问会error
改POST请求加上账户密码重新发送得到flag
uname=G0od!JAVA3C41PTISAGO&upass=1pt_Pa4sW0rd_K3y_H3re
曲奇
访问信息:3.1.1.2(web端口:80)
题目描述:伪造cookie,flag{}
题目难度:初级
解密得到key.txt
http://3.1.1.2/key.txt
抓一个请求包看看什么情况
感觉存在文件包含漏洞,改成包含了key.txt(需要包含的文件名会经过base64编码),现在对index.php进行base64编码再继续文件包含
使用burpsuite发送构造的请求
整理可以使用intruder模块爆出使所有line参数对应出现的代码
然后对完整的PHP代码进行整理
<? php error_reporting (0) ; $file=base64 decode (isset ($_GET[ ' file'] ) ?$_GET[ ' file' ] : "") ; $line=isset ($ GET[ ' line' ] ) ?intval ( $_GET[ ' line' ] ) : 0; if ($file == ' ') header ("location: index. php?line=&file=a2V5LnR4dA == ") ; $file list = array( 'O' =>'key. txt' , '1' =>'index. php' , ); if (isset ($_COOKIE [ 'key'] ) && $_COOKIE [ 'key'] == 'li_lr 480') { $file_list [2]='thisis_flag.php';
Jif(in_array ($file, $file_list) ) { $fa = file ($file); echo $fa[$line] ; } ?> |
- 首先关闭了错误报告(error_reporting(0)),这会隐藏脚本执行过程中的错误信息
- 从 GET 参数中获取并处理输入:
- 对file参数进行 base64 解码
- 对line参数进行整数转换,默认为 0
- 有一个简单的跳转逻辑:
- 如果解码后的file为空,则跳转到index.php?line=&file=a2V5LnR4dA==
- 其中a2V5LnR4dA==是 base64 编码,解码后为key.txt
- 定义了一个文件列表数组$file_list:
- 初始包含两个文件:'key.txt' 和 'index.php'
- 如果存在名为 'key' 的 Cookie 且其值为 'li_lr 480',则添加 'thisis_flag.php' 到文件列表
- 核心功能逻辑:
- 检查解码后的file是否在允许的文件列表中
- 如果在列表中,则读取该文件内容并输出指定行($line参数指定的行)
将file参数置为dGhpc2lzX2ZsYWcucGhw(thisis_flag.php的base64码),访问http://127.0.0.1/index.php?line=0&file=dGhpc2lzX2ZsYWcucGhw,用bp抓包,在包中添加一行cookie:key=li_lr_480,可以通过cookie欺骗的方式访问thisis_flag.php文件,添加完毕,点击“go”,就可以得到flag
flag{UHGgd3rfH*(3HFhuiEIWF}
思路很重要
访问信息:3.1.1.3(web端口:80)
题目描述:粗心的程序员,ctf{}
题目难度:初级
F12查看源代码,然后访问 http://3.1.1.3/index.php.bak
$flag='xxx'; extract($_GET); if(isset($shiyan)){ $content=trim(file_get_contents($flag)); if($shiyan==$content){ echo'ctf{xxx}'; } else{ echo'Oh.no';} } |
file_get_contents()这个函数存在漏洞,用 php://input绕过,所以只要shiyan和post的数值相等即可
http://3.1.1.3/index.php?shiyan=1&flag=php://input
然后对flag进行凯撒解密 ctf{web-shi-yan-bar}
序列化1
访问信息:3.1.1.4(web端口:80)
题目描述:easy反序化,flag:{}
题目难度:初级
抓请求包看看
子目录爆破扫描发现vi编辑器临时文件 index.php.swp
将pass解密,得一个md5值,d28df74179cc31fb1224a032e429d40f,解密md5为20150903,
http://3.1.1.4/changepassword.php?userInfo=a:2:{s:2:“id”;i:3;s:4:“pass”;s:8:“20150923”;}&oldPass=20150923&newPass=111111
身份验证
访问信息:3.1.1.5(web端口:80)
题目描述:网站怎么进行身份验证的,flag{}
题目难度:初级
修改伪造一下请求字段
Host: 127.0.0.1
X-Forwarded-for:127.0.0.1
再看看为什么不是管理员,
修改其中一个值即可Cookie: isadmin=1
到底是不是number
访问信息:3.1.1.6(web端口:80)
题目描述:代码审计,flag{}
题目难度:初级
点击—view the source code
关键码
else if (strlen($_GET[‘password’]) < 8 && _GET['password'] > 9999999) { if (strpos (_GET[‘password’], ‘-’) !== FALSE)
分析:
要获得一个长度小于8,值大于999999的数
所以要用到科学计数法
并且该数中要包含“-”
单纯在数中加“-”会无意义,使用%00截断后,加上*-*
即:原url后加入“1e8%00*-*”
CTF{Ch3ck_anD_Ch3ck}