首页
关于
壁纸
友情链接
Search
1
三丰云:免费虚拟主机和云服务器!!!
6,764 阅读
2
本地部署deepseek
5,527 阅读
3
记一次简单的渗透测试
5,364 阅读
4
国漫崛起-《哪吒2》
5,323 阅读
5
文件上传漏洞
4,702 阅读
默认分类
登录
Search
白羊
累计撰写
53
篇文章
累计收到
92
条评论
首页
栏目
默认分类
页面
关于
壁纸
友情链接
搜索到
53
篇与
的结果
2025-05-04
三丰云:免费虚拟主机和云服务器!!!
作为一名用户,我非常乐意为三丰云写一篇评测文章,帮助更多人了解和使用他们的免费虚拟主机和云服务器服务。三丰云是一家提供免费虚拟主机和云服务器的公司,他们的产品质量非常出色。在我使用的过程中,我发现他们的服务器稳定性很高,网站加载速度也非常快。与此同时,他们的用户界面也非常友好,让我能够轻松地管理我的网站。作为一家免费服务提供商,三丰云的免费虚拟主机和云服务器功能非常强大。他们提供了大量的存储空间和带宽,足以满足个人网站和小型企业的需求。而且,他们还提供了一键安装各种应用程序的功能,让我能够快速搭建我的网站。我在评测过程中还发现,三丰云的技术支持非常出色。无论我遇到什么问题,他们的客服团队总是能够及时给予解答和帮助。他们的工作效率和专业素质让我印象非常深刻。总的来说,我非常推荐三丰云的免费虚拟主机和云服务器服务。他们的产品质量和技术支持都非常出色。如果你正在寻找一家可靠的免费服务提供商,我强烈建议你考虑三丰云。如果你想了解更多关于三丰云的信息,可以访问他们的官方网站:https://www.sanfengyun.com。在那里你能够找到更详细的产品信息和注册使用的步骤。希望我的评测文章能帮助更多人了解和使用三丰云的免费虚拟主机和云服务器服务。感谢三丰云对我们的支持,让我们一起实现互惠互利、合作共赢的目标!
2025年05月04日
6,764 阅读
14 评论
293 点赞
2025-05-03
记一次简单的渗透测试
某天比较无聊,听一个朋友推荐httpscan这款工具,于是就下载下来试试。首先对某学校网段开始进行测试。python httpscan.py **.**.**.0/24测试时发现有个比较特殊的标题。一般有这个,证明存在目录遍历。 目录遍历这个漏洞,说大也不大,说小也不小,但是,一般来说,存在这种目录,可以证明网站管理员比较粗心,当然也有可能会把一些敏感文件放在上面,如数据库文件,账号文件等。尝试google搜索intitle:Index of / 开始渗透 当时访问后,发现是以下的状况。 这个就又比较开心,看到了phpinfo。这个文件和目录遍历漏洞性质也差不多,说大也大,说小也小。phpinfo属于处在信息收集阶段的一个重头,当有了这些信息,可以看出服务器端调用了那些库,以及一些敏感路径,从而进行深入的漏洞挖掘。用途也是很广的。所以建议各个站长,不要将这个文件泄露出来。phpinfo先放一边,先点开1目录看一下,发现是一个discuz 3.2的站 尝试搜索discuz 3.2 getshell,最终发现有个 Test ,但此时我们没有后台权限。于是继续搜索,也没发现什么有价值的。于是改变思路,想一下如何能进入后台。尝试弱口令登录,最终admin admin 成功登录后台。当时的心情是绝望的。顺理成章,直接进入后台,找到好贷站长联盟 2.0.2安装,并启用。 然后进行配置,输入我们的一句话即可。 成功拿到shell 控制服务器当然,这么简单的渗透,拿到shell肯定是不够的。要想办法进而打开3389,成功夺取服务器权限,这样可以实现长久控制。首先shell打开命令行,查看一下用户权限后续创建后门用户,远程登录即可,或获取管理员明文密码当然,由于用的是蚁剑,已经说明了。 此时因为用的就是最高权限,所以就不用再进行提权了。
2025年05月03日
5,364 阅读
18 评论
563 点赞
2025-04-24
某开源cms 0day挖掘
简介CicadasCMS是用springboot+mybatis+beetl开发的一款CMS,支持自定义内容模型、模板标签、全站静态化等功能。漏洞挖掘sql注入(成功)漏洞发生位置在com.zhiliao.module.web.cms.ContentController#save: @RequiresPermissions("content:save") @RequestMapping("/save") @ResponseBody public String save(TCmsContent content, HttpServletRequest request, @RequestParam(value = "tag",required = false) String[] tags ) throws SQLException { TCmsCategory category =categoryService.findById(content.getCategoryId()); TCmsModel cmsModel = modelService.findById(category.getModelId()); List<TCmsModelFiled> cmsModelFileds = modelFiledService.findModelFiledListByModelId(category.getModelId()); UserVo userVo = UserUtil.getSysUserVo(); content.setSiteId(userVo.getSiteId()); content.setUserId(userVo.getUserId()); content.setInputdate(new Date()); content.setModelId(category.getModelId()); /*Jin:使用Map接收:遍历获取自定义模型字段*/ Map<String, Object> formParam =Maps.newHashMap(); for (TCmsModelFiled filed : cmsModelFileds) { if(filed.getFiledClass().equals("checkbox")||filed.getFiledClass().equals("image")) { String[] filedValue = request.getParameterValues(filed.getFiledName()); if (filedValue!=null) { formParam.put(filed.getFiledName(), filedValue); } }else { String filedValue = request.getParameter(filed.getFiledName()); if (!StrUtil.isBlank(filedValue)) { formParam.put(filed.getFiledName(), filedValue); } } } if(content.getContentId()!=null) return contentService.update(content,cmsModel.getTableName(),cmsModelFileds,formParam,tags); return contentService.save(content,cmsModel.getTableName(),formParam,tags); }save方法接受了一个content对象为参数,这个content对象包含主键contentId等信息,formParam对象为一个新建的hashMap,用于保存表单数据的键值对,表示了一些扩展字段和其对应值,那么在这个逻辑中,如果contentId不为空,则调用com.zhiliao.module.web.cms.service.ContentService#update更新数据,否则调用com.zhiliao.module.web.cms.service.ContentService#save进行数据保存:com.zhiliao.module.web.cms.service.impl.ContentServiceImpl#update(com.zhiliao.mybatis.model.TCmsContent, java.lang.String, java.util.List<com.zhiliao.mybatis.model.TCmsModelFiled>, java.util.Map<java.lang.String,java.lang.Object>, java.lang.String[]): @CacheEvict(cacheNames ="cms-content-cache",allEntries = true) @Transactional(transactionManager = "masterTransactionManager",rollbackFor = Exception.class) @Override public String update(TCmsContent content, String tableName, List<TCmsModelFiled> cmsModelFileds, Map<String, Object> formParam, String[] tags) throws SQLException { /*初始化文章的推荐和顶置为false*/ content.setRecommend(CmsUtil.isNullOrEmpty(content.getRecommend())?false:true); content.setTop(CmsUtil.isNullOrEmpty(content.getTop())?false:true); content.setUpdatedate(new Date()); if(contentMapper.updateByPrimaryKeySelective(content)>0) { /*创建lucene索引*/ if(categoryService.findById(content.getCategoryId()).getAllowSearch()) { IndexObject indexObject = new IndexObject(); indexObject.setId(content.getContentId().toString()); indexObject.setTitle(content.getTitle()); indexObject.setKeywords(content.getKeywords()); indexObject.setDescription(content.getDescription()); indexObject.setPostDate(DateUtil.formatDateTime(content.getInputdate())); indexObject.setUrl(this.httpProtocol + "://" + ControllerUtil.getDomain() + "/front/" + content.getSiteId() + "/" + content.getCategoryId() + "/" + content.getContentId()); luceneService.update(indexObject); } /*保存和文章管理的Tag*/ if (tags != null) for (String tag : tags) { tagService.save(content.getContentId(), tag); } this.SaveModelFiledParam(formParam,content,tableName,cmsModelFileds); return JsonUtil.toSUCCESS("操作成功", "", true); } return JsonUtil.toERROR("操作失败"); }又调用了com.zhiliao.module.web.cms.service.impl.ContentServiceImpl#SaveModelFiledParam进行数据保存:接着跟进com.zhiliao.module.web.cms.service.impl.ContentServiceImpl#SaveModelFiledParam方法: @Transactional(transactionManager = "masterTransactionManager",rollbackFor = Exception.class) public int SaveModelFiledParam(Map<String, Object> formParam,TCmsContent content,String tableName,List<TCmsModelFiled> cmsModelFileds) throws SQLException { if(!CmsUtil.isNullOrEmpty(formParam)) { String exeSql; Connection connection = dataSource.getConnection(); Statement statement = connection.createStatement(); String selectSql = "select * from t_cms_content_"+tableName+" where content_id="+content.getContentId(); ResultSet resultSet =statement.executeQuery(selectSql); /*判断内容扩展表是否存在数据*/ if(!resultSet.next()) { exeSql = "insert into t_cms_content_" + tableName.trim() + " set "; exeSql += "`content_id`=" + content.getContentId() + ", "; for (Map.Entry<String, Object> entry : formParam.entrySet()) { exeSql += "`" + entry.getKey() + "`"; if(CmsUtil.isNullOrEmpty(entry.getValue())) return 0; if (entry.getValue() instanceof Integer) { exeSql += "=" + entry.getValue() + ", "; } else if (entry.getValue().getClass().isArray()) { /*遍历字符数组,数组来源为checkbox和多图上传*/ String[] result = (String[]) entry.getValue(); if (result != null) { String tmp = ""; for (String value : result) { if(StrUtil.isBlank(value)) continue; tmp += value + "#"; } exeSql += "='" + tmp.substring(0, tmp.length() - 1) + "', "; } } else { exeSql += "='" + entry.getValue() + "', "; } } /*执勤Sql前截取最后面的空格和英文逗号,并加上‘;’*/ exeSql = exeSql.substring(0, exeSql.length() - 2) + ";"; int status= statement.executeUpdate(exeSql); statement.close(); connection.close(); return status; }else { exeSql = "UPDATE t_cms_content_" + tableName.trim() + " set "; /*遍历Map保存扩展数据表,代码有些复杂*/ for (TCmsModelFiled filed : cmsModelFileds) { if(CmsUtil.isNullOrEmpty(formParam.get(filed.getFiledName()))) continue; exeSql += "`" + filed.getFiledName() + "`"; if (formParam.get(filed.getFiledName()) instanceof Integer) { exeSql += "=" + formParam.get(filed.getFiledName()) + ", "; } else if (!CmsUtil.isNullOrEmpty(formParam.get(filed.getFiledName())) && formParam.get(filed.getFiledName()).getClass().isArray()) { /*遍历字符数组,数组来源为checkbox和多图上传*/ String[] result = (String[]) formParam.get(filed.getFiledName()); if (result != null) { String tmp = ""; for (String value : result) { tmp += value + "#"; } exeSql += "='" + tmp.substring(0, tmp.length() - 1) + "', "; } } else { exeSql += "='" + formParam.get(filed.getFiledName()) + "', "; } } /*截取最后面的空格和英文逗号,并加上‘;’*/ exeSql = exeSql.substring(0, exeSql.length() - 2) + "where `content_id`=" + content.getContentId() + ";"; int status =statement.executeUpdate(exeSql); statement.close(); connection.close(); return status; } } return 0; }那么这里执行的逻辑是:首先进行非空判断,接着遍历表单数据并且动态拼接到sql执行语句中,最后进行执行,显然这里是存在sql注入漏洞:文件上传(失败):com.zhiliao.common.upload.UploadComponent#uploadFile:public UploadBean uploadFile(MultipartFile multipartFile, HttpServletRequest request){ TSysAttachment attachment = new TSysAttachment(); /** 获取用户会话 **/ UserVo userVo = (UserVo)request.getSession().getAttribute(CmsConst.SITE_USER_SESSION_KEY); if(userVo!=null) { attachment.setUserId(userVo.getUserId().toString()); attachment.setUsername(userVo.getUsername()); } attachment.setUploadDate(new Date()); attachment.setUploadIp(ControllerUtil.getRemoteAddress(request)); attachment.setFileSize(Float.valueOf(multipartFile.getSize())/1024); attachment.setFileExtname(multipartFile.getContentType()); attachment.setFileKey(UUID.randomUUID().toString().replace("-","")); attachment.setOriginalFilename(multipartFile.getOriginalFilename()); /*创建uploadBean*/ UploadBean result = new UploadBean(); String fileType = this.getFileType(attachment.getOriginalFilename()); String fileName = this.getFileName(fileType) ; String newName =this.getNewFileName(fileName); if (!multipartFile.isEmpty()) { if (!Boolean.parseBoolean(qiniuUpload)) { File file = new File(this.getUploadPath() + newName); /*如果不存在就创建*/ if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } try { this.writeFile(multipartFile.getBytes(), file); attachment.setFilePath(newName); attachment.setFileName(fileName); if(Boolean.parseBoolean(enableFullPath)) { result.setFileUrl(request.getScheme() + "://" + ControllerUtil.getDomain() + "/res/" + attachment.getFileKey() + "." + fileType); }else { result.setFileUrl("/res/" + attachment.getFileKey() + "." + fileType); } attachmentService.save(attachment); } catch (Exception e) { throw new ApiException(e.getMessage()); } }else { String qiniuFileResult = QiniuUtil.upload(accessKey, secretKey, bucketname, multipartFile); if (!StrUtil.isBlank(qiniuFileResult)) { String fileKey = JSON.parseObject(qiniuFileResult).getString("key"); String fileUrl = domain + "/" + fileKey; if (StrUtil.getExtensionName(fileName).equals("jpg") || StrUtil.getExtensionName(fileName).equals("JPG") || StrUtil.getExtensionName(fileName).equals("png") || StrUtil.getExtensionName(fileName).equals("PNG") || StrUtil.getExtensionName(fileName).equals("jpeg") || StrUtil.getExtensionName(fileName).equals("JPEG")) { fileUrl += "?imageslim"; } result.setFileUrl(fileUrl); } } return result; }else{ throw new ApiException("上传文件不能为空!"); } }这里的newName是从this.getNewFileName(fileName);得到的,fileName又是通过this.getFileName(fileType) ;获得的:那么跟进com.zhiliao.common.upload.UploadComponent#getFileType: public String getFileType(String fileName) { String type = fileName.substring(fileName.lastIndexOf(".") + 1); return type; }那么这里是使用了lastIndexof函数,这样的话看上去后文件的类型是不可控的。总结这套源码是很老了,整体难度不大,非常适合新手进行学习。
2025年04月24日
1 阅读
0 评论
0 点赞
2025-04-19
python生成6位数验证码
for i in range(1000000): if i<10: i = ‘00000’+str(i) elif 10<=i and i<100: i =’0000’+str(i) elif 100<=i and i<1000: i =’000’+str(i) elif 1000<=i and i<10000: i =’00’+str(i) elif 10000<=i and i<100000: i =’0’+str(i) else: i=str(i) with open(‘6位数字验证码.txt’, ‘a’) as f: f.write(i+”\n”)
2025年04月19日
644 阅读
15 评论
36 点赞
2025-04-14
文件上传漏洞
{mtitle title="文件上传漏洞"/}漏洞简介 文件上传,顾名思义就是上传文件的功能行为,之所以会被发展为危害严重的漏洞,是程序没有对访客提交的数据进行检验或者过滤不严,可以直接提交修改过的数据绕过扩展名的检验。文件上传漏洞是漏洞中最为简单猖獗的利用形式,一般只要能上传获取地址,可执行文件被解析就可以获取系统WebShell。 漏洞原理 在文件上传的功能处,若服务端脚本语言未对上传的文件进行严格验证和过滤,导致恶意用户上传恶意的脚本文件时,就有可能获取执行服务端命令的能力,这就是文件上传漏洞。 漏洞危害 文件上传漏洞对Web应用来说是一种非常严重的漏洞。一般情况下,Web应用都会允许用户上传一些文件,如头像、附件等信息,如果Web应用没有对用户上传的文件进行有效的检查过滤,那么恶意用户就会上传一句话木马等Webshell,从而达到控制Web网站的目的。 漏洞高危触发点存在文件上传功能的地方都有可能存在文件上传漏洞,比如相册、头像上传,视频、照片分享。论坛发帖和邮箱等可以上传附件的地方也是上传漏阔的高危地带,另外像文件管理器这样的功能也有可能被攻击者所利用。 值得注意的是,如果移动端也存在类似的操作的话,那么相同的原理,也存在文件上传漏洞的风险。上传点和绕过形式前端绕过 只在前端用JS来做效验,很容易修改绕过 判断是否js验证 查看页面源码 查看响应速度(前端验证如果出现错误是不会传递到服务器的,所以上传错误文件,响应速度会非常快)绕过方法禁用JS脚本(可以使用插件禁用) F12调出审核元素,在JS脚本中删除或修改文件类型 使用代理上传文件,BurpSuite上传符合要求的文件类型,抓包修改文件类型后端验证黑名单解析漏洞.htaccess文件解析漏洞 apache解析漏洞 IIS7.0 | IIS7.5 | Nginx的解析漏洞 IIS6.0解析漏洞截断上传截断类型:PHP%00截断 截断原理:由于00代表结束符,所以会把00后面的所有字符都截断 截断条件:PHP版本小于5.3.4,PHP的magic_quotes_gpc为OFF状态大小写绕过 比如:aSp和pHp之类。 黑名单扩展名的漏网之鱼 用字典跑 比如: asa和cer之类 asp: asa cer aspx jsp: jspx jspf php: php php3 php4 php5 phtml pht exe: exee利用Windows的命名机制shell.php. shell.php空格 shell.php:1.jpg shell. php::$DATA shell.php:1.jpg 在windows中,后缀名后面的点和空格都会被删除掉。双写绕过 有时候在检测时,后台会把敏感字符替换成空格,这个时候,我们可以使用双写进行绕过。比如:pphphp 白名单原理只允许代码规则写的文件名上传绕过方式解析漏洞截断上传文件包含MIME检测什么是MIME MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。常见的MIME类型text/plain (纯文本) text/html (HTML文档) text/javascript (js代码) application/xhtml+xml (XHTML文档) image/gif (GIF图像) image/jpeg (JPEG图像) image/png (PNG图像) video/mpeg (MPEG动画) application/octet-stream (二进制数据) application/pdf (PDF文档)MIME绕过的原理部分Web应用系统判定文件类型是通过content-type字段,黑客可以通过抓包,将content-type字段改为常见的图片类型,如image/gif,从而绕过校验。文件头检测漏洞原理 在每一个文件(包括图片,视频或其他的非ASCII文件)的开头(十六进制表示)实际上都有一片区域来显示这个文件的实际用法,这就是文件头标志。我们可以通过16进制编辑器打开文件,添加服务器允许的文件头以绕过检测。 常见的文件头: 注意:下面的文件头的格式是16进制的格式: GIF:47 49 46 38 39 61 //GIF89a png:89 50 4E 47 0D 0A 1A 0A JPG:FF D8 FF E0 00 10 4A 46 49 46 在进行文件头绕过时,我们可以把上面的文件头添加到我们的一句话木马内容最前面,达到绕过文件头检测的目的。内容检测图片马绕过 一般文件内容验证使用getimagesize函数检测,会判断文件是否是一个有效的文件图片,如果是,则允许上传,否则的话不允许上传。图片马制作: Notepad++制作 使用Notepad++编辑器,打开图片直接添加一句话木马(快,方便)手动制作 准备一张图片,这里为a.png,和一个木马,通过以下命令合成一个图片马3.png: a.png内容:<?php eval($_POST['1']); ?>cmd命令:copy test.png /b a.php /a 3.png #copy语句中b指二进制文件,a指ascii码文件
2025年04月14日
4,702 阅读
0 评论
316 点赞
1
2
...
11
0:00