在wordpress上部署JS挖矿脚本

估计现在很多人对比特币,区块链技术,以及挖矿等名词已经耳熟能详了。

总感觉这些东西能够传播得这么快,5月份的wannacry勒索病毒功不可没。

要是那病毒勒索欢乐豆,不知现在又是怎样一番景象。

就我的认知而言。现在挖矿主要是有三种。

一是那些矿场老板,用服务器,矿卡来挖矿。

二是传播病毒,木马之类的,用肉鸡来挖矿。

三应该是现在兴起的,在网页的JS里面嵌入挖矿脚本,使用访客的资源来获益。

现在随着虚拟货币越来越火,比特币也很难挖到了。

所以JS挖矿脚本主要是挖的门罗币。

而且根据挖门罗币的那个算法(CryptoNight )

CPU和GPU挖矿没有特别悬殊的差异,

还可以用浏览器来进行。

那些流量大的网站都想用挖矿来代替广告投放了。

我们挖矿之前首先要有个虚拟货币的钱包。

门罗币钱包创建地址:https://mymonero.com/#/create-your-account

进去页面之后会有一个Your Private Login Key:

这个东西就是登陆的凭证:(私钥)

登录之后就会得到一个门罗币钱包地址:

私钥还有钱包地址千万不要忘记。

有了钱包地址之后就可以准备在博客上部署js挖矿脚本了。

有个门罗币的JS挖矿项目:

https://ppoi.org/

先在上面注册个账号用来获得博客的站点标识和使用JS挖矿脚本的API密钥

设置挖矿的站点:

输入要获得收益的门罗币钱包地址

有多种方式可以在博客上部署

我博客上用的是简易挖矿UI和验证码以及挖矿插件:

挖矿插件的话主要是适用于WordPress、Discuz!、DedeCMS或Typecho等程序的ProjectPoi集成插件

插件的话下载下来安装,然后配置一下就可以了.

最简单的就是简易挖矿UI:

在某个可以自定义HTML的功能点:

把以下代码粘贴进去,记住替换 YOUR_SITE_KEY 成您自己的站点标识码。

<script src=”https://ppoi.org/lib/miner.min.js” async></script>
<div class=”projectpoi-miner”
style=”width: 256px; height: 310px”
data-key=”YOUR_SITE_KEY”>
<em>请禁用Adblock!</em>
</div>

验证码挖矿:

就是在用户评论处新增了挖矿功能,

只有用户在他们的浏览器上帮我运算完指定的hash才能进行评论。

(而且这个验证码是在客户端和服务端都做了校检,很难绕过)

这种JS挖矿脚本其实很影响用户体验。

想到这里,突然有个猥琐的想法。

现在的黑客攻击和漏洞基本上产生在用户交互的地方,比如,留言,评论,订单,登录处,比如某群里的表哥说过的wordpress上一版本(4.8.1)评论处是存在XSS。

那么我们现在可以把这个JS挖矿脚本火力全开,在用户注册,登录页面,以及评论页面都引入验证码类型的挖矿脚本,再将首页嵌入的简易挖矿UI设为自动开始,把挖矿的线程开满。

测个评论处的xss,Cpu飙到100,风扇狂转,连看个首页都卡,这种渗透测试一定很刺激。

就好像知乎里某位大佬说的,如果网站被DDOS了,那就举报自己网站,让自己网站被墙,

利用伟大的墙来阻隔一定的DDOS攻击。

类似这种猥琐的操作,在这个领域里应该还是很多哈

我可能没有活得想象中的那般潇洒

 

以前认为自己向往自由

后来发现并没有,只是没有遇见合适的人之前的一种自我催眠。

一直很喜欢神秘,小众的爱好,

四年之前的跑酷,现在的网络,以及电音和superpads

有段时间很喜欢听民谣,等某些歌开始烂大街了,

毫不犹豫的放弃,

包括刚学一个月的吉他。

坚持了两年的夜跑,也因为操场上逐渐增多的人流而不了了之。

三年前的自己,孤身一人也可去很多地方

而现在,醒来好像就没了一天的盼头。

该酷的东西还是很酷。

但是感觉自己这个人却越来越没有意思了。

本以为自己会的东西能给自己一份神秘的气质,能够每天都保持着玩味的笑容。

可是并没有,

也许我自诩的神秘感,只是别人的懒得打听。

心中在意的人对我一无所知。

我自己也是如此。

好像每天所做的东西。

不能用来取悦自己了。

日复一日,越来越不开心,

在宿舍楼的天台,思考了一番人生之后。

我好像抑郁了

 

 

 

 

 

 

 

 

 

 

 

 

Teensy2.0++烧录渗透测试U盘

最近入手了一个Teensy2.0++,昨天实战了一番,发现这东西还是很有意思的。

几番捣鼓,烧录完程序之后,插在同学电脑上,效果显著。(昨天没来得及拍图,因为当场被他抓住了)

BadUsb简介

通过硬件直接插入对方电脑,让对方电脑执行代码,达到干扰、控制主机或者窃取信息等目的。

威胁

BadUSB的威胁在于:恶意代码存在于U盘的固件中,PC上的杀毒软件无法访问到U盘存放固件的区域,因此也就意味着杀毒软件和U盘格式化都无法应对BadUSB的攻击。

原理

可以看这个博主的文章:

http://blog.csdn.net/cd_xuyue/article/details/50500579

 

 

攻击流程

Bad-Usb插入后,会模拟键盘鼠标对电脑进行操作,通过这些操作打开电脑的命令终端,并执行一条命令,这条命令将从指定网址下载其他代码并于后台静默运行。这些代码功能包括:窃取信息、反弹shell、发送邮件等,从而实现控制目标机或者窃取信息的目的。

所需工具

1.Teensy ++ 2.0

2.Teensyduino插件

3.arduino

步骤

先入手一个Teensy系列的开发板

下载安装 ARDUINO IDE(也就是开发环境)    https://www.arduino.cc/en/Main/Software/

根据系统选择对应的版本。

装好之后类似这样的

接下来是安装对应的库和Teensyduino插件

下载地址 http://www.pjrc.com/teensy/td_download.html

安装到 ARDUINO IDE对应的文件夹。

安装完成之后,打开ARDUINO IDE

进行开发板的选择和配置:

开发环境就准备好了,接下来就是利用代码的编写和烧录

让我们跳过代码编写这一步(因为我把C忘光了)

GITHUB上一些比较实用的BadUSB代码:

https://github.com/lr3800/teensy/blob/master/_win_hacked_by.ino

这里我选择的是同学的win10系统,没有截图。MMP,差点都回不来了。

盗个其他大佬的。

 

 

 

Python-map(V1.0)—–主机探测之代码冗长,龟速扫描(没脸更新版)

把自己学会的技能用到生活中感觉好有意思。

上午刷慕课的时候答题页面用js屏蔽了粘贴,然后我用burpsuite的repeater模块绕过了,直接复制别人答案urlencode之后发包就好了,23333

还用burp抓包之后直接POST刷完了教学视频哈哈哈。

然后下午就一直在写个主机探测脚本(好久没有搞python了,函数式编程。。。)

话说python是真的脏:

运行示例:

源码:


#!/usr/bin/env python
#-*- coding: utf8 -*-
# Author: HandP
# Date: 20171025
import os
import sys
import socket
IPNumToString = lambda x: '.'.join([str(x/(256**i)%256) for i in range(3,-1,-1)])
IPStringToNum = lambda x:sum([256**j*int(i) for j,i in enumerate(x.split('.')[::-1])])
StartIP = 0
EndIP = 0

def helpmessage():
message = """
======================================================
= =
= scanhosts V1.0 =
= Usage: =
= python scanhosts.py 1.2.3.4 =
= python scanhosts.py 1.2.3.4-255 =
= python scanhosts.py 1.2.3.4 - 1.2.4.5 =
= python scanhosts.py f targetfile
======================================================
"""
print message

def settargets():
try:
commandargs = sys.argv[1:]
if not commandargs:
return False
commandargs = ''.join(commandargs)
commandargs = commandargs.split('-')
global StartIP
global EndIP
commandlen = len(commandargs)
if commandlen == 1:
StartIP = EndIP = int(IPStringToNum(commandargs[0]))
elif commandlen == 2:
StartIP = commandargs[0]
EndIP = commandargs[1]
if len(StartIP.split('.')) !=4 :
return False
endiplen = len(EndIP.split('.'))
if endiplen == 1:
prefixip = StartIP.split('.')[0:3]
prefixip.append(EndIP)
EndIP = '.'.join(prefixip)
elif endiplen == 4:
pass
else:
return False

StartIP = int(IPStringToNum(StartIP))
EndIP = int(IPStringToNum(EndIP))

except Exception,e :
print e
return False
return True

def checkhoston(ip):
try:
if "TTL" in os.popen("ping -n 1 %s"%IPNumToString(ip)).read():
return True
except Exception as e:
print e

def processcheckhost():
global StartIP
global EndIP
alivecount = 0
StartIP = int(StartIP)
EndIP = int(EndIP)
totalip = EndIP - StartIP + 1
if totalip <= 0: helpmessage() exit(0) print 'Startint scan ',IPNumToString(StartIP),' -> ',IPNumToString(EndIP), ',please wait...'
fd = open('scanhost.txt',"w")

ip = StartIP

while True:
if ip > EndIP:
break
if checkhoston(ip):
fd.write(IPNumToString(ip)+'\n')
alivecount = alivecount + 1

ip = ip + 1
sys.stdout.write('#')
if (ip-StartIP) % 20 == 0:
sys.stdout.write('\r\n')
fd.close()
return alivecount

def showresult(shownnum):
if not os.path.isfile('scanhost.txt'):
print '[-]'+'scanhost.txt'+'does not exists!'
exit(0)
if not os.access('scanhost.txt',os.R_OK):
print '[-]'+'scanhost.txt'+'access denied'
exit(0)
fd = open('scanhost.txt',"r")
for line in fd.readlines(shownnum):
print line.strip('\n')
fd.close()

def scanactivehost():
pass

def main():
global StartIP
global EndIP
alivehost = 0
count = 0
if not sys.argv[1:]:
helpmessage()
exit(0)
if str(sys.argv[1]).lower() == "f":
filename = sys.argv[2]
if not os.path.isfile(filename):
print '[-]'+filename+'does not exists!'
exit(0)
if not os.access(filename,os.R_OK):
print '[-]'+filename+'access denied'
exit(0)
else:
f = open(filename,'r')
saveresult = open('scanhost.txt',"w")
print "[+] scanprogress start now , please wait!"
for line in f.readlines():
line = line.strip('\n')
if checkhoston(int(IPStringToNum(line))):
saveresult.write(line+'\n')
alivehost = alivehost + 1
count += 1
sys.stdout.write('#')
if count % 20 == 0:
sys.stdout.write('\r\n')
saveresult.close()
f.close()
print "\r\n [%d] host is on,please see the scanhost.txt, top 300 will be shown below" % alivehost
showresult(300)
if alivehost > 300:
print "More ips please see scanhost.txt"
exit(0)
else:
if not settargets():
helpmessage()
exit(0)
alivecount = processcheckhost()
print "\r\n [%d] host is on,please see the scanhost.txt, top 300 will be shown below" % alivecount
showresult(300)
if alivecount > 300:
print "More ips please see scanhost.txt"

if __name__ == "__main__":
main()

献丑献丑,溜了

勿忘初心

前几天跟带我入门的大表哥促膝长谈了一番,也逐渐想找回当初学习安全的初心。

大概是因为一个鸡肋越权漏洞,才开始我的安全之路的吧。

慢慢在知乎上了解到关于它的一些。

开始关注余弦,乌云等有意思的人或事

在网上搜索技能数和书籍

真正开始学习是在2月末

花了35块买了7节关于kail的课。

现在想来,简直是收智商税呀,那么简单的arp欺骗以及kail的安装就特么收35,

晚上随便百度就有的

不过那时候学得很开心,即使把自己劫持了也还是很好玩。

后来看边界安全的教程,

拿着AWVS把学校的子域扫遍了,

玩了大部分常规类型的漏洞。

也认识了一些同路人,

那时候生活好像就是,没啥事就看视频,打靶场。有课的话就带着本《白帽子讲Web安全》去上课。晚上跟表哥们开“黑”

AWVS爆个红就能开心好一会。

但是后来不再是了

开始浮躁了,

教程看不进去,站日不了,洞找不到。

现在想来,

大概是因为自己在没有相应的能力的情况下,想要的却太多。

还有一个原因是因为不知道把这个东西当做爱好还是职业。

却慢慢淡忘了自己是为什么才走上这条路的

是为了好玩啊。

我给了自己太多压力,

导致平常的渗透学习都开始变味,找不到洞就浮躁。

这样注定走不远。

很想念每一次,漏洞复现之后的“卧槽”

以及恶作剧之后渐渐浮现在嘴角的猥琐笑容

至于继续当个爱好者还是安服人员。

Who Care!

只要在路上,只要还能感到刺激

过不久就要去新靶场了

又要开始搞事了

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

XSS平台搭建

Xss没怎么玩过,主要是javascript不是很熟,不能自己写一些花式的payload,只会做个简单的验证。

Xss深入利用的话主要是根据一些Xss平台:里面会提供一些很实用的payload:或者是l利用BEEF这个web框架攻击平台

自己收藏的Xss平台:https://xss.jozxing.cc/index.php?do=login

http://x.ohlinge.cn/index.php?do=login

不过就像webshell箱子一样,感觉使用这种平台就是给别人打工的。

我这里用的是wooyun某位大牛利用Bootstrap修改前端代码之后的Xsser.me源代码,界面看起来漂亮多了。并且可以自定义邮件和短信提醒,不用担心不能及时查收快递。


源码下载:链接:http://pan.baidu.com/s/1gfdUYiB 密码:efp1

下载之后解压源码,放到网站目录,然后修改配置文件:config.php

改什么地方你心里没点逼数么……

将根目录下的数据库文件(xssplatform.sql)导入到mysql数据库中

不过导入的时候出了点问题:

源文件里的数据库文件没有“`pvicnikh_xss`”这个数据库:

然后导致导入.sql文件的时候出错了,mmp

解决办法是:先在mysql命令行或者是phpmyadmin可以执行sql语句的地方创建一个pvicnikh_xss数据库,然后在要导入的xssplatform.sql这个文件里加上一条:

USE `pvicnikh_xss`;

 

导入之后执行SQL语句:

记得在那个pvicnikh_xss数据库里面执行

UPDATE oc_module SET code=REPLACE(code,’http://xsser.me’,’http://yourdomain/xss’)

就是把前辈原来那些项目payload里面的域名换成我们自己的

配置伪静态文件:

Apache:(.htaccess)


RewriteEngine On
RewriteBase /
RewriteRule ^([0-9a-zA-Z]{6})$ /index.php?do=code&urlKey=$1 [L]
RewriteRule ^do/auth/(\w+?)(/domain/([\w.]+?))?$  /index.php?do=do&auth=$1&domain=$3 [L]
RewriteRule ^register/(.?)$ /index.php?do=register&key=$1 [L]
RewriteRule ^register-validate/(.?)$ /index.php?do=register&act=validate&key=$1 [L]

Nginx:


rewrite "^/([0-9a-zA-Z]{6})$" /index.php?do=code&urlKey=$1 break;
rewrite "^/do/auth/(w+?)(/domain/([w.]+?))?$" /index.php?do=do&auth=$1&domain=$3 break;
rewrite "^/register/(.?)$" /index.php?do=register&key=$1 break;
rewrite "^/register-validate/(.?)$" /index.php?do=register&act=validate&key=$1 break;
rewrite "^/login$" /index.php?do=login break;

将建好的.htaccess文件放在所建项目根目录即可。注意在有的情况下,rewrite模块默认没有被引入,这个时候需要自己手工引入,如在Apache 配置文件中取消下面一行前面的注释符(#):

apache 配置文件为httpd.conf

LoadModule rewrite_module modules/mod_rewrite.so

基本完成安装。接下来就是优化还有配置之类的。

Xss平台设置了邮件提醒,

至于里面有个可以飞信通知的设置没弄,飞信这个是好久的东西了哦。

平台的话,估计会关闭注册,因为我也不咋用。

 

 

 

 

 

 

 

不留遗憾-记录一次脑洞大开的社工

大学社工过三个曾经令我心动的妹子。

基本上算是与这三个妹子比较 投缘吧,

在偌大的校园里,见过三四次面也许能算有缘对不对。

第一次遇见,只是单纯的表示对美女的欣赏,略微投去火热的目光。

第二次遇见,则是欣喜。

后面的相遇,则是充满更多的好奇,

与之擦肩而过之时,总是刻意留意,她们与旁边同学的关系。以及交谈的内容。

仔细分析,总会有意想不到的收获。

比如,社工的第一个妹子是因为某次相遇时,偶然听到了她的班级名字。

第二个,则是在某次去学校超市买东西时,在刷学生卡的瞬间,看见了她的名字,

虽然名字很特殊,三个字中我只认识两个,但是我记住了形状,厉害吧!

第三个,则是以前一个社团的,没讲过话,在社团大群里知道名字和学院,算是信息比较多的了。

虽然现在基本上都没见面了,不过也没多大兴趣了,像这种级别的女神,估计早就没戏了。

而我在一顿骚操作社工出她们的手机号和QQ号之后,也会感到满足。

 

即使本身还是个losier.

说到底,还是最后一个棘手。

而且是我收集信息的时间最长的,也是最耐心的,

第一次遇见好像是在大二快结束时,

当时只记住了她笑的样子。

后来又见了几次面,

大概猜出了她的学院,好像是经管的,不过 ,当时没能继续往下社工,

因为学院下面细分了好几个专业,班级之类的。虽然手上有学校某个网站的鸡肋越权,但是

感觉工作量太大,大海捞针。所以一拖就是一年,

直到前天, 某个水课,政治方面的。无聊的看着seay的代码审计,突然发现我们专业竟

然跟经管学院某个专业在一起上课。留心观察一下,她没有在。

心中一喜,隔了一年是时候解开心结了。

回到宿舍,

首先将以前写过的抓取全校学生名单的爬虫代码给改了一些。

抓取条件改为:经管学院,女生,跟我同一级,然后排除了当初跟我一起上课的那两个班。

把学号抓取出来之后,就使用了自己以前写的一个利用越权漏洞下载证件照片的脚本。

稍微改了一下,没有抓取经管二专业以及留学生之类的照片。

下面的操作比较考验运气和耐心。

爬取出来的是高考报名时的证件照,你需要逐个欣赏,然后从中找到女神,判断出她的学号ID,(因为爬虫保存照片的时候是根据学号保存的)

不过看这些照片确实熬人,证件照的质量(你懂得)

然后就获取到了妹子的学号,

根据学号获取到的信息有:

姓名,班级,课表,专业(可以蹲点)

其实这些只是开胃小菜,

同样是那个网站,还有一个逻辑漏洞,在学生登录页面,没有做登录限制,验证码没有及时刷新,在验证一次之后可以进行抓包重放,可以进行爆破。

不过我用了另一种方式,进入了用户中心。

现在基本信息都有了,生日,身份证号,根据身份证号很容易知道老家位置,具体到县城。还有QQ。

还没结束,

多亏学校强大的平台。

以及SSO之类的认证系统:

 

我知道了

她平时在图书馆阅读的书籍,

食堂的消费记录

以及大学的通知书号,手机号

成绩以及奖学金情况

 

 

连银行卡号都知道了。。。

 

 

也许正常操作的我在知道这些信息之后应该跑去她经常去的食堂吃饭,去她上课的教室自习。

不过现在我最关注的是另外一个地方,基于现在已有信息的扩大战果的方式,

1.基于手机和QQ可以在社工库,探寻一番,看看有没有什么好东西,或者找出用手机和QQ相关联的网站,看下有没有什么共同点,或者说现在是她的求职季,有没有招聘相关的网站可以稍加利用,给她发一份公司的招聘简章进行钓鱼也是OK的。

2.现在手头有一份很有意思的东西,常用IP登录日志。

我跟她属于同一个内网,看下有没有什么姿势可以利用。(而且学校分给我这台机器的内网IP一直没变过)

 

啊哈,上面两个其实都是我的脑洞,技术菜如我怎么可能办得到呢,刚才连一个重置密码的漏洞都挖掘失败了。

算了,重拾python,写点东西,然后坐校车去了

 

嗯,也许是学校里的最后一次社工了,把她的信息拿小本本记下来,扔进专门记录回忆的文件夹里,  基本上就不留什么遗憾了。

你不是抑郁,你是真的惨

妈蛋,不小心把博客里的图片全删了。。。。

最近一直在审计这个yxtcmf

在开源的版本里发现的漏洞挺多的,但是

在商业版里:

贼鸡儿尴尬。

而且他这个开源版本里阉割了很多东西,很多本来可以出现xss的地方不能顺利弹窗,因为本地搭出来的环境连回复功能都没有。。。。

不过还好审计到一个及其犀利的支付逻辑漏洞,看下官网demo能不能复现,然后看下黑白盒结合着看下就去提交了。

再说下我原来的审计思路:

看过phpoop大神的审计案例,说是TP框架的话一般不存在注入,但是我们审计的这个蛇皮cmf,他有个地方把GPC都关了,然后有些地方没有过滤就存在注入。

至于xss的话

他这个cmf虽然开了默认过滤,但是有很多地方都是使用了

htmlspecialchars_decode这个编码转换,所以又导致了xss漏洞。

 

唉,现在的我是真的惨,学渗透把python忘了,学php把渗透技巧忘了,学代码审计不会写php了。。。

也许才开始吧,

2017年三月开始拥抱安全,

现在放弃还是太早,

没挖着大厂的高危,没有cve,什么也没有

 

 

 

 

 

yxtcmf代码审计

拿到一份php源码,像我这样的代码审计小白,自然要先上漏洞库和搜索引擎找一下相关的漏洞和大牛的审计案例,然后才开始进行蛇皮审计,要不然那些框架什么的看的我头大。

首先说下这个yxtcmf:

YxtCMF在线学习系统是一个以thinkphp+bootstrap为框架进行开发的网络学习平台系统。

乌云上没有相关的漏洞,因为这个开源cmf是后面才出来的。看下cnvd的

然后再附上一个大牛的审计案例(侵删):该博主分析出来两个前台sql注入漏洞。

http://blog.csdn.net/ZZZJX7/article/details/53114324?locationNum=13&fps=1

我这边审计的是最新免费版的v3.1.0,官网的授权付费版已经更新到4.3.0了,大概是修补了几个比较严重的sql注入和有关账户之类的逻辑漏洞吧(不过也有可能没补,开发人员的事谁说的清呢)

cnvd只提供了很小一部分漏洞细节,不过我们可以照着标题寻找漏洞,谁叫他开源呢。那就简单复现一下,跟进一下有问题的函数和变量,为后面自己的蛇皮审计打点基础。

先看下大牛的姿势:

在index.php中:网站没有对注入进行防护,假如开启gpc都帮你关掉(很友善的操作)

注入1:需要先登陆
缺陷代码:对传入的$state没有进行过滤
\application\User\Controller\CenterController.class.php
POC:http://127.0.0.1/index.php?g=user&m=center&a=order&state=1) AND (SELECT * FROM (SELECT(SLEEP(5)))pror) AND (8565=8565
注入2:登陆以后申请成为教师
在application\Teacher\Controller\CenterController.class.php中
没有过滤传过来的type_id
POC:http://172.16.9.31/yxtcmf/index.php?g=teacher&m=center&a=add_post
post:ty_id=1
CNVD:
1.downmaterial函数存在任意文件下载漏洞。
在application\Course\Controller\CourseController.class.php中:
$file_name = $data[‘downname’];
$file_dir =$data[‘url’];
$file = @ fopen($file_dir,”r”);
没有经过任何过滤,可以下载任意文件,但是需要登录。
2.存储型xss(addpost函数)
在\application\Forum\Controller\PlateController.class.php中
  
$data[‘name’]没有过滤,$data[‘brief’]近乎没过滤,可以导致存储型xss
3.courseedit_post函数存在存储型跨站脚本漏洞。
在application\Teacher\Controller\CenterController.class.php中:
不是很懂他这个过滤的写法。
4.study函数存在存储型跨站脚本漏洞
在文件application\Course\Controller\CourseController.class.php中
这个函数写的太特么长了,贴个出现漏洞的地方。
又是这个喜闻乐见的过滤方式,导致了存储型xss;
粗略看了一下这个方法,里面貌似还能挖到注入之类的。不过先把前辈们提交的洞复现完。
5.易学堂在线学习系统v3.1.0存在逻辑设计漏洞,攻击者可利用漏洞重置任意用户密码,获取用户敏感信息。
哇,逻辑漏洞是平常比较喜欢挖掘的(因为我比较菜,属于那种拿不了shell,提不来权的那种)
冥冥之中感觉提交漏洞的那位前辈是黑盒与白盒结合的方法来挖出这个逻辑漏洞的。
不过真正尝试复现的时候出了很多问题:官网旗下的站点重置密码的页面打不开,返回的是TP的报错页面。
本来代码里写的两种注册方式,重置密码也有邮件和手机两种途径,但是本地搭建的站点(只能用手机注册,而且验证码还出不来。。。。)
看下自己认为有可能出现问题的地方好了,
application\User\Controller\SettingController.class.php中:
重置密码的函数:repasspost():
session不可控,貌似出现漏洞的就是在验证码简单情况下的爆破。
再看下邮件重置的:application\User\Controller\LoginController.class.php中
里面有个验证key的代码:
$activekey=md5($uid.time().uniqid());
$uid.timer()还好,但是这个uniqid()函数就基本上标志着重置密码漏洞已经凉了。
而且进行$activekey的验证之后才能进入重置的流程。。。。。

xiaocms逻辑漏洞审计

平常玩黑盒测试的时候,由于接触时间短,底子薄,一般拿不来shell,对逻辑漏洞倒是很有感觉。

没想到现在学php代码审计,也尽出来一些逻辑漏洞。。。

都怪这个xiaocms,注入之类的搞得很死,采用了pdo防注入,还有很多类似addslashes,html_speciales之类的过滤函数,即使好不容易碰见几个个urldecode编码的可控变量也利用不起来。(其实大部分原因是自己太菜)

不过逻辑漏洞还是很有意思的哇,能看见php程序员一些蛇皮的思路

就接着上一篇文章那个可以无视这个cms任何验证码的洞接着补充好了。

上回说虽然在管理员登录页面无视验证码,但是有限制。

今天一看登录处的代码才发现原来是可以很轻松的进行爆破的(那天好像是想着赶紧特么弄出一个洞来睡觉,然后没有仔细审计,大意了)

admin\controller\login.php

 

if (!$this->checkCode($this->post(‘code’))) $this->show_message(‘验证码不正确’,2,url(‘login’));

这段代码是判断验证码是否正确,空值可绕过:


else {
if ($this->session->get('admin_login_error_num')) {
$error = (int)$this->session->get('admin_login_error_num') - 1;
if ($error <= 1) { $this->session->delete('admin_login_error_num');
$this->cookie->set('admin_login', 1, 60*15);
} else {
$this->session->set('admin_login_error_num', $error);
}
} else {
$error = 10;
$this->session->set('admin_login_error_num', 10);
}
$this->show_message('账户或密码不正确,您还可以尝试'.$error.'次', 2, url('login'));

这段代码使用session统计了密码错误的次数,当达到最大限制登录次数就在客户端的cookie里面添加键值'admin_login_error_num', 10.'admin_login', 1, 60*15用来限制爆破。不过cookie不是我们做主的么,所以使用burpsuite的Intruder模块直接绕过这些花里胡哨的东西。

只是做个检测。。。

下面也是一个逻辑漏洞

xiaocms会员模块里的任意用户登录(除了admin)很鸡肋,因为这个会员模块需要单独下载。。。而且看了一下,公网上使用这个程序的一般都是展示站,没有会员注册之类的模块

member\controller\login.php:


public function indexAction() {
if ($this->member_info) $this->show_message('您已经登录了。',1, url('index/'));
if ($this->post('submit')) {
$data = $this->post('data');
if ($this->site_config['member_logincode'] && !$this->checkCode($this->post('code'))) $this->show_message('验证码不正确', 2,1);
if (empty($data['username']) || empty($data['password'])) $this->show_message('用户名或密码不能为空', 2,1);
$member = $this->db->setTableName('member')->getOne('username=?', $data['username']);
$gobackurl= $data['gobackurl'] ? urldecode($data['gobackurl']) : url('index');
if (empty($member)) $this->show_message('会员名不存在', 2,1);
if ($member['password'] != md5(md5($data['password']))) $this->show_message('密码错误', 2,1);
$this->cookie->set('member_id', $member['id']);
$this->cookie->set('member_code', substr(md5($this->site_config['rand_code'] . $member['id']), 5, 20));
$this->show_message('登录成功', 1, $gobackurl);
}

这段代码主要是判断了下验证码,会员名格式,密码做了下验证。精彩的在最后三行代码

$this->cookie->set('member_id', $member['id']);
$this->cookie->set('member_code', substr(md5($this->site_config['rand_code'] . $member['id']), 5, 20));
$this->show_message('登录成功', 1, $gobackurl);
}

当前面条件满足后就往用户的cookie里面写登录信息。。。

这个member_id是会员的编号,按照注册顺序从1往后排

'member_code'这个键对应的值由site_config['rand_code']和上面的$member['id']构成。

substr(md5($this->site_config['rand_code'] . $member['id']), 5, 20));这个算法只需要知道site_config['rand_code'],

 

而尴尬的是,这个值并不像名字一样起得那么随机。他写在了配置文件里。。。

data\config\config.ini.php:

然后就可以伪造一波会员登录

只需在cookie里加两个字段:

xiaocms_member_id=1; xiaocms_member_code=feabcffb3afd23878ecb

本地验证是成功的,为了看下这个所谓的随机值,还重复下了好几遍源码重装。测试了多遍

在公网上未做测试。估计这个模块用的太少,还要跟cms分开下。

这个cms跟用户交互太少,要是能让我挖到一个前台getshell的洞就好了。

文章写得很烂,主要着急去看漫展