2018年10月24日星期三

编码,乱码,如何透彻理解

编码

在python里面,你定义一个字符串的时候,就已经通过编码器,对你输入的字符串进行编码,并且放入内存。

规则1:放入内存里面的字符串,一定经过编码

当使用print 对字符串变量进行打印,必须要对字符串进行解码才能显示。注意这里只是显示,要显示正确,必须用对应的字符集(gbk, gb2312, utf-8, ascii)。如果显示错误(仅是人类感知,计算机不知道情况),就是乱码

规则2:控制台标准输出,浏览器显示区,notepad文字区等,都是需要进行解码后才可以显示的

举例:
在写自动发送邮件过程,包含多次编码解码动作

1. 生成html文件,在python3可以指定编码。
2. 读取的时候,在python2.7需要进行指定解码字符集,
3. 经过bottle模块,模板处理的时候也需要进行解码
4. smtp发送邮件,也需要进行编码
5. 最后foxmail客户端,就是我们的数据展示区,还需要对邮件内容进行解码

那么多个过程涉及编码,所以出现乱码,要冷静分析,看看数据处理的过程,分析出原因


要更深入了解乱码,首先你要能够随时制造编码错误

  
UnicodeDecodeError: 'utf8' codec can't decode byte 0xb5 in position 2: invalid start byte
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb5 in position 2: ordinal not in range(128)

通过下面代码,制造错误
>>> a='as的'
>>> print a
as的
>>> print a.decode('utf-8')
>>> print a.decode('ascii')
>>> print a.decode('gbk')
>>> print a.decode('gb2312')
>>> print a.decode('cp936')
-

2018年10月17日星期三

bash脚本的坑

    你会写python脚本,但是不会写shell脚本,其实只要注意几步,就可以像写python那样简单

0x01 bash脚本第一坑
变量赋值竟然不支持空格。
 
a = "my name" ✘ 这样是不能赋值成功的,并且提示“-bash: a: command not found”
a="name"      ✔

array[0] = "hello"  ✘
array[0]="hello"    ✔

0x02 变量调用需要加$

echo $a
array[0]=$a

0x03 bash脚本第二坑
数组会自动对字符串变量进行分割,这个特性很不好,特别对字符串处理的时候,
这个特性不应该作为自动分割,如果需要使用分割功能, 加上特别的参数,这样设计更合理

output="i am a boy"
这个变量赋值给array的时候会进行分割
array=($output)
最后,变成:
array[0]="i"
array[1]="am"
array[2]="a"
array[3]="boy"

要使"i am a boy"存入array后保持完整,可以用下面的方法:
array[0]=$output
array=([0]=$output)


0x04 jq调试工具
--raw-input-R
不要将输入解析为JSON。相反,每行文本都作为字符串传递给过滤器。如果与之结合使用--slurp,则整个输入将作为单个长字符串传递给过滤器。

--raw-output-r: 解析后的字符串去引号
使用此选项,如果过滤器的结果是字符串,则它将直接写入标准输出,而不是格式化为带引号的JSON字符串。这对于使jq过滤器与非基于JSON的系统进行通信非常有用。
0x05 curl只输出json数据
这样会输出http头部信息
curl -i -H "Content-Type: application/json" -X POST http://127.0.0.1/api/add

只输出http body的json数据
curl -s -H "Content-Type: application/json" -X POST http://127.0.0.1/api/add


参考链接:
1. BASH 数组用法小结









2018年9月19日星期三

2018年8月30日星期四

安全练习靶场收集

phpcms系统
1. axublog

sql注入测试
2. sqli-labs
3. RedTiger's hackit

2018年8月20日星期一

docker学习过程

0x00 背景
       最近要部署一套安全应急中心系统,需要使用docker进行部署安装,以前经常听过docker,也了解过,但是就是没用过,其实只是使用docker部署环境,其实没什么太大的难度,只要掌握基本的命令,就可以操作了。

0x01 我理解的docker
         容器有运行的概念。
              1.  run,创建容器运行命令
              2.  start/stop/restart ,容器创建后可以通过docker ps -a 查看已经创建的容器
                   docker start [容器id],就可以启动容器
              3.  stats , 可以查看容器的运行状态,内存使用情况,cpu使用情况,磁盘网络IO
              4.  kill & rm,关闭docker / 删除容器




















    进入容器的shell有两种方法:
    docker attach [容器ID]                 # 这是进入docker run时的交互shell
    docker exec -it [容器ID] bash      #  这是打开一个新的shell

    如果想直接在终端中查看启动命令的输出,用 attach;其他情况使用 exec。
    当然,如果只是为了查看启动命令的输出,可以使用 docker logs 命令:
    docker logs -f 的作用与 tail -f 类似,能够持续打印输出。

0x02 docker仓库配置
        各个版本的docker仓库配置不一样
        中国科学技术大学的开源镜像

        docker images  -- 查看本地已经下载的镜像














0x03 如何解决Docker容器和宿主机时间同步问题

把时区设置加入到Dockerfile中
# CentOS
   RUN echo "Asia/shanghai" > /etc/timezone;

# Ubuntu
   RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

0x04 查看容器的启动命令

在容器外部,物理机上,可以用docker inspect查看。
如果在容器内部。可以用 ps -fe 查看。其中1号进程就是启动命令。

查看共享文件的映射关系
docker inspect 1cb8e758f58e | grep -A10 HostConfig

        "HostConfig": {
            "Binds": [
                "/opt/xunfeng_8000:/data"



参考链接:
1. 用docker实现微服务的便捷运维












2018年6月19日星期二

php代码审计与YII框架

php代码审计

工具:phpstorm + seay源代码审计系统

phpstorm 高效审计快捷键:
Ctrl + G                     行号跳转
Ctrl + Alt + <-/->     跳转返回/前进
Ctrl + 点击                 查找函数/类/变量,定义或者使用
Ctrl + Shift + F          全局搜索字符串
Ctrl + Shift + N         全局搜索文件名

url路由:
1. apache,nginx等web服务器的配置实现路由,例如:
    rewrite ^/([^/]+)/([^/]+)/.* /$1/$2/index.php last;
 
^/    :  以/开头
([^/]+):分组$1,不是/的任意多个字符
([^/]+):分组$2,不是/的任意多个字符
.*    : 任意多个字符

2. 通过程序代码进行url路由


sql注入防御:
1. PDO需要对用户输入参数进行bind
2. AR

参考链接:
1. YII框架的sql注入测试,与防范方法
2. Yii2中如果你这么写,可能造成sql注入漏洞
3. YII2安全之SQL注入和XSS攻击
4. Class yii\db\Connection,YII 2.0官方文档,有防注入的介绍
5. YII源码分析
6. 深入理解Yii2.0
-----------------------
7. Yii防止sql注入、xxs方法
8. 活动记录(Active Record)
-----------------------
9. 高级PHP应用程序漏洞审核技术