Reber's Blog

会一点点编程、会一点点渗透


iptables 简单配置 DMZ

0x00 要求

  1. 内网可以访问外网
  2. 内网可以访问DMZ区
  3. 外网不能访问内网
  4. 外网能访问DMZ区的服务
  5. DMZ区不能访问内网
  6. DMZ区不能主动访问外网

0x01 拓扑

50

more...

Python 简单解码 IP 头

0x00 解码IP头

Windows上运行时要以管理员身份运行
代码可以解码IP头统计通信信息并保存到文本,同时统计数量

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import socket
import os
import sys
import time
import struct 
from ctypes import *

host = "10.22.114.114"

tcp_num = 0
udp_num = 0
icmp_num = 0

class IP(Structure):
    _fields_ = [
        ("ihl",         c_ubyte,4),
        ("version",     c_ubyte,4),
        ("tos",         c_ubyte),
        ("len",         c_ushort),
        ("id",          c_ushort),
        ("offset",      c_ushort),
        ("ttl",         c_ubyte),
        ("protocol_num",c_ubyte),
        ("sum",         c_ushort),
        ("src",         c_ulong),
        ("dst",         c_ulong)
    ]

    def __new__ (self,socket_buffer=None):
        return self.from_buffer_copy(socket_buffer)

    def __init__ (self,socket_buffer=None):
        self.protocol_map = {1:"ICMP",6:"TCP",17:"UDP"}
        
        self.src_address = socket.inet_ntoa(struct.pack("<L",self.src))
        self.dst_address = socket.inet_ntoa(struct.pack("<L",self.dst))
        try:
            self.protocol = self.protocol_map[self.protocol_num]
        except:
            self.protocol = str(self.protocol_num)

if os.name == "nt":
    socket_protocol = socket.IPPROTO_IP
else:
    socket_protocol = socket.IPPROTO_ICMP

sniffer = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket_protocol)

sniffer.bind((host,0))
sniffer.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)

if os.name == "nt":
    sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)

try:
    while True:
        raw_buffer = sniffer.recvfrom(65565)[0]

        ip_header = IP(raw_buffer[0:32])
        msg = "Protocol: %-5s %-15s -> %s" % (ip_header.protocol,ip_header.src_address,ip_header.dst_address)
        if ip_header.protocol == "TCP":
            tcp_num = tcp_num + 1
        elif ip_header.protocol == "UDP":
            udp_num = udp_num + 1
        elif ip_header.protocol == "ICMP":
            icmp_num = icmp_num + 1
        num = "TCP:%d\tUDP:%d\tICMP:%d" % (tcp_num,udp_num,icmp_num)
        # print num
        with open("data.txt","a+") as f:
            f.write(msg+"\n")
        sys.stdout.write(num+"\r")
        sys.stdout.flush()
        time.sleep(0.5)
        print
#CTRL-C
except KeyboardInterrupt:
    if os.name == "nt":
        sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_OFF)

0x01 结果

程序运行信息

more...

SSRF

0x00 什么是SSRF

SSRF(Server-Side Request Forgery:服务请求伪造)是一种由攻击者构造,从而让服务端发起请求的一种安全漏洞,它将一个可以发起网络请求的服务当作跳板来攻击其他服务,SSRF的攻击目标一般是内网
当服务端提供了从其他服务器获取数据的功能(如:从指定URL地址获取网页文本内容、加载指定地址的图片、下载等),但是没有对目标地址做过滤与限制时就会出现SSRF。

more...

Python 的编码问题

0x00 几个编码函数

* ord(x)  
    将字符转换为10进制整数(0~255之间) #ord('a')==>97
* chr(x)  
    将10进制整数(0~255之间)转换为字符 #chr(97)==>'a',chr(0x61)==>'a'

* b2a_hex(x)  
    将字符转换为对应的16进制 #import binascii;binascii.b2a_hex('a')==>'61'
* a2b_hex(x)  
    将16进制转换为对应的字符 #import binascii;binascii.a2b_hex('61')==>'a'

* hex(x)  
    将10进制整数转换为对应的16进制 #hex(16)==>'0x10'
* oct(x)  
    将10进制整数转换为对应的8进制  #oct(9)==>'011'

0x01 设置为utf-8

  • 在py文件开头设置
#!/usr/bin/env python
#-*- coding: utf-8 -*-

#coding=utf8
  • 永久编码(推荐) python编码出错.png 可以在python安装路径下的Lib\site-packages下新建文件sitecustomize.py文件,内容如下:
#coding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# 此方法修改了python环境,设置系统默认编码,永久有效

0x03 编码转换

python默认unicode为中间编码,所以无论是何种编码,解码时默认都解码为unicode

more...

sqlmapapi 的简单使用

0x00 关于sqlmapapi.py

当利用sqlmap时一次只能测试一个url,效率很低,而用sqlmapapi就可以实现批量

0x01 用于交互的方法

在sqlmap/lib/utils/api.py中:

more...

CSRF 漏洞

0x00 概念

当你登陆某个网站时,通常浏览器与网站都会形成一个会话,在会话没有结束时你可以执行发表文章、发邮件、删除文章等操作,若会话结束,你再操作的话会提示你会话已经结束,请重新登陆。

more...

SQL 注入之防御

0x00 要做的事

也就是找到注入点然后修复

0x01 防御方法

  • 使用预编译语句绑定变量(比如php的mysqli、pdo)
    <?php
        //预编译
        $mysqli = new mysqli("localhost","root","123456","share");
        $mysqli->query("set names utf8");
        $sql = "INSERT INTO test (name,sex,age) VALUE(?,?,?)";
        $s = $mysqli->prepare($sql);
        //绑定参数
        $name = "Tom";
        $sex = "M";
        $age = 23;
        $s->bind_param("ssi",$name,$sex,$age);//ssi的意思是字符、字符、整型
        //执行
        $result = $s->execute();
        var_dump($result);
        $s->close();
    ?>
  • 使用存储过程(这里以SQLServer举例)
--如果存在名为get_student_msg(相当于函数)的存储过程则删除
IF EXISTS (SELECT name FROM sysobjects WHERE name='get_student_msg' AND type='p')
    DROP PROCEDURE get_student_msg

CREATE PROCEDURE get_student_msg --创建存储过程
    @name VARCHAR(20) --声明全局变量
AS
    BEGIN
        SELECT * from info
        WHERE name=@name
    END
GO

--创建好存储过程后在其他地方直接使用函数并传参就行了
EXEC get_student_msg 'xiaoli'
  • 使用转义函数
    如:addslashes()和mysql_real_escape_string()
    在php.ini设置auto_prepend_file自动在脚本执行前在首部加载文件
<?php
    //简单过滤
    $filter = array(&$_GET,&$_POST,&$_COOKIE);
    foreach ($filter as $key => $value){
        foreach ($value as $k => $v){
            $filter[$key][$k] = mysql_real_escape_string($v);
        }
    }
?>

SQL 注入之宽字节注入(MySQL)

0x00 应用场景

在注入时通常会使用单引号、双引号等特殊字符。在应用中,通常为了安全,开发者会开启php的magic_quotes_gpc,或者使用addslashes、mysql_real_escape_string等函数对客户端传入的参数进行过滤,则注入的单引号或双引号就会被"\"转义,但是,如果服务端的数据库使用的是GB2312、GBK、GB18030等宽字节的编码时,则依然会造成注入。

more...

SQL 注入之基于时间的注入(MySQL)

0x00 特点

当页面存在注入,但是没有显示位且不管怎么测试返回页面都没有变化,此时可以使用基于时间的盲注进行注入。
其实只要存在SQL注入就可以使用基于时间的盲注,利用范围比较广泛,但是可能受到网络带宽等因素的影响。

0x01 利用方式

整型注入的话可以直接: ?id=if(1=1,sleep(2),1)
字符型的话需要闭合: ?id=2' and if(1=1,sleep(2),1) and '1

0x02 相关函数

  • if(条件, 值1, 值2)
    当条件为真时返回值1,条件为假时返回值2

    more...

SQL 注入之布尔型注入(MySQL)

0x00 特点

当页面存在注入,但是没有显示位,且没有用echo "mysql_error()"输出错误信息时可以用,
它一次只能猜测一个字节,速度慢,但是只要存在注入就能用

0x01 利用方式

用and连接前后语句:www.xxx.com/aa.php?id=1 and (注入语句) --+
根据返回页面是否相同来得到数据

0x02 注入步骤

  1. 找到注入点,判断闭合字符 得到闭合字符

    more...

Previous Page 13 of 18 Next Page