Centos java jdk安装和环境配置
环境配置这东西 大多时候用一次找一次 不胜其烦。
今记录一下Centos Java的jdk直接从源安装。相比编译之类的,已经是极大的幸福感提升。
最近在看慕学网《强力Django+xadmin打造在线云课堂》这个教程。
感觉还不错。昨日看到用户模块,修改密码功能的逻辑编写,觉得存在比较大的安全隐患。刚刚按照思路小撸了一下,可以修改任意用户密码。
刚登录一台测试服务器,习惯性地ll查看下home目录下的文件.
结果,我差点卡死了…
原因是当前目录下居然有6,7万条记录.
类似下面这种
1 | index.php?i=361&c=entry&do=cron&m=qidong_saishi.62468 |
原因是开发在crontab添加了一个定时每分钟 wget一下某个网址.没用curl.
每分钟就下载一个网页到home目录.
然后我改为curl后,想删除掉文件,rm -f index.php?*
然后报错
1 | argument too long |
也是第一次遇到这个问题.可能是一下子删除的文件太多?
于是打算用 xargs来逐条删除.
1 | ll | grep index | awk '{print $9}'|xargs rm -f |
前面三条主要是想吧路径单独列出来.
done.
闲置一阵没折腾django后,再续上次学习进度捣鼓demo的时候发现了这.
1 | list index out of range |
看看报错和xadmin模块有关,但是我之前没报错,而我又没对它做过改动,一脸懵逼.
主要是在注册的数据模型中新增数据,都会报这个错.在django原生的admin模块后台是没这个错误的.
基本锁定和xadmin有关了.
遂百度 xadmin list index out of range.果然有发现,见参考资料文章.
说是django升级后出现新标签导致的这个错误.而我之前对django升级过.django 1.11.12.
文中介绍了如何修改xadmin达到目的.我懒,降级了django回 django 1.11 没毛病老铁.
百度了一圈,没人发过,算是0day吧。
近日有朋友发了一个小说站,日流量很可观,几万IP一天。
后来就留意, 近日得到一套该站用的wap端的源码,看了下信息是个人写的。感觉可能会有漏洞,就瞄了几眼,果然发现点端倪。
首先是mysql.class.php
的类。
它有个checksql()
的方法,每次调用都会获取所有的GET,POST,COOKIE的参数。进行正则匹配,企图发现恶意注入的SQL内容。
但是SQL过滤不是很严,还是有绕过的空间。比如十六进制,一些注释符,过滤的sql语句比较有限。
主要内容
1 | private $getfilter = "'|(and|or)\\b.+?(>|<|=|in|like)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)"; |
要说构造语句添加信息或者查询信息还是不容易的。所以利用起来似乎也不容易。
在看到用户模块的时候,倒是发现新大陆了。
看修改用户资料的处理代码。controllers/user.class.php
1 | public function information(){ |
info_sex
性别的字段居然可以是字符串型,不转为整型,而且也没对它做长度检查。反倒是info_intro
做了长度检查。
经过sqlcheck
后就进入以下语句直接查询了。
1 | $db->query("UPDATE ".JIEQI_DB_PREFIX."_system_users SET name='".$info_nickname."',email='".$info_emial."',sex=".$info_sex.",sign='".$info_sign."',intro='".$info_intro."' WHERE uid=".$userinfo->uid); |
利用思路:
注册一个普通用户,然后利用注入修改用户组为管理员组。
修改用户信息的时候,拦截POST内容。然后修改`sex=1`为`sex=1,groupid=2`,杰奇cms是开源的,所以我能看到表字段,groupid为2的是系统管理员,有着后台所有权限。
搞定。
发现他升级了后台,数据库备份不能用,也不能上传PHP,因为系统默认限制这个。因为是Linux系统,所以也没一些目录解析漏洞可以利用。
利用前提是magic_quotes_gpc 处于关闭状态。杰奇因为限制一定要要zend3.3.x解密,所以用的php版本是5.3以下的,
这就有了文件名截断的漏洞可以利用,有了这个,文件包含漏洞也就更加有可能了。好在经过一番寻找,发现了一个文件包含漏洞,利用起来更加方便,可以直接getshell。
就在处理动态加载脚本广告的时候。
book.class.php
1 | public function ad(){ |
简述一下吧
符合条件的,直接头像上传php一句话,后缀名为.jpg.取得图片地址.
构造url”http://domain/configs/ad/{头像相对路径}%00.php"
截断后面的php即可.
后面的你都知道了.
Django使用django-simple-captcha
生成验证码。
django-simple-captcha Github地址
pip install django-simple-captcha
添加captcha
到 settings.py的INSTALLED_APPSL里面。
运行python manage.py migrate
生成数据表
配置urls.py
1 | urlpatterns += [ |
新建forms.py
1 | from captcha.fields import CaptchaField |
models.py
直接验证表单是否通过,验证码字段会一并校验。
1 | class RegisterView(View): |
form算是和一个和安全问题有关的一个东西了。
用来设置一些规则,对用户提交的字段进行一些筛选。
把不符合要求的字段过滤在外,这个一般前端也会做相应的处理。
但是有时候是可以被绕过的,比如提交正常的POST数据,然后拦截数据包,修改后,再POST。
新建<path-to-your-app>/forms.py
比如我登录认证的表单中含有username和password两个字段,那我可以定义这两个字段的规则。
它的使用方式有点像我们定义models一样,都是前面变量为关键字段名,后面跟着字段类型和属性。
以下设置了两个字段为必填项,并且对长度做了一些限制
1 | from django import forms |
然后可以在具体的逻辑中引用它
如我在前面一个文章中提到的登录验证中
调用它is_valid()
方法来认证
views.py
1 | class LoginView(View): |
结果传递给页面,页面可以处理,并展示它的返回错误信息之类的。
如模板中遍历它错误的值,打印出来。
1 | {% for key,value in login_form.errors.items %}{{ value }}{% endfor %} |
Django提供了比较方便的用户认证模块,只要导入它,就可以很方便就完成用户认证。
主流有两种写法,一个是直接写成函数,一个写成类,重载get和post方法
<path-to-your-app>/views.py
authenticate()
和login()
1 | from django.contrib.auth import authenticate, login |
然后在urls.py
1 | from users.views import login_view |
1 | class LoginView(View): |
1 | from users.views import LoginView |
或
,且
等条件查询。这里用|,或组合查询。check_password
对比密码,如果符合,就返回用户信息。<path-to-your-app>/views.py
1 | from django.contrib.auth.backends import ModelBackend |
1 | AUTHENTICATION_BACKENDS = ( |
done.
添加了模型,想在后台管理,使用xadmin的话,和django有一点点不一样。
在每个app下面新建一个adminx.py,导入相应的模型xadmin.site.register(UserFavorite, UserFavoriteAdmin)
1 | # _*_ coding:utf-8 _*_ |
list_display
是在后台展示的列list_filter
是在后台提供过滤器的字段search_fields
是开启搜索功能的字段
最后将模型和定义的模型管理注册一些。
注册到后台后,菜单那里默认显示的模型名是我们定义的英文名,要想改成中文,需要修改以下两个地方。
<path-to-you-app>/apps.py
1 | class OperationConfig(AppConfig): |
<path-to-you-app>/__init__.py
1 | default_app_config = 'operation.apps.OperationConfig' |
xadmin github 地址: https://github.com/sshwsfc/xadmin
因为在使用的过程中避免不了会对xadmin做一些更改,所以,一般都是建议git clone源码到自己项目中使用。
替换django原有的admin也比较简单。
在urls.py中
1 | import xadmin |
即可
在app的adminx.py中重载基础设置和全局设置。
1 | from xadmin import views |
待持续更新…也可能再也不更新… 2018/01/21