sql注入时case when ... then ... else ...end 的应用

在基于时间的盲注的时候,一般使用的是if语句,如果符合条件就sleep,但是部分不能使用逗号的场景下,还可以使用case when #condition then ... else ... end语句来代替if语句,参考http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html

某开源系统中

$this->ip = mysqli_real_escape_string($mysqli,$_SERVER['REMOTE_ADDR']);
if( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ){
    $REMOTE_ADDR = $_SERVER['HTTP_X_FORWARDED_FOR'];
    $tmp_ip=explode(',',$REMOTE_ADDR);
    $this->ip = $tmp_ip[0];
}

然后注入点在insert和update语句中。一个盲注场景,没有报错和回显。

阅读全文...

最近遇到的几个技术问题

docker MySQL的binlog无法开启

binlog需要配合server-id一起使用,默认是65536,但是docker镜像不知道为什么没有这个值,所以直接添加log-bin的选项会出错,但是连一个错误提示都没有,浪费了好久。

解决方案

FROM mysql:latest
RUN printf "\nserver-id=1\nlog-bin=binlog\n" >> /etc/mysql/my.cnf

这里硬编码了一个server-id,如果MySQL是主从复制的模式运行,请自行配置server-id

全局变量与锁的问题

有一个Python的C语言拓展模块,大致的用法是

module.run(foo=bar, log_path="run.log")
module.run(foo=bar, log_path="test.log")

但是发现多次连续的运行并没有写入两个文件,而是都在第一个文件中,而这部分是由一个现成的日志模块完成的,查看日志模块的代码

static FILE *log_fp                 = NULL;
static char *log_filename           = NULL;
static int  log_opened              = 0;

int log_open(const char* filename)
{
    if (log_opened == 1)
    {
        return 0;
    }
    log_fp = fopen(filename, "a");
    if (log_fp == NULL)
    {
        exit(1);
    }
    atexit(log_close);
    log_opened = 1;
    log_extra_info[0] = 0;
    return 1;
}

很明显使用了全局变量,而这些变量是在Python代码中import这个模块的时候没有初始化的,而调用过一次模块方法后就被赋值了,这时候再次调用的时候,全局变量log_opened是1了,所以没有重新打开新的日志文件。

里面还有一个方法是

void log_close(void)
{
    if (log_opened)
    {
        fclose(log_fp);
        log_fp       = NULL;
        log_filename = NULL;
        log_opened   = 0;
    }
}

如果在模块的最后面主动调用这个方法的话,那很可能产生竞态条件,因为都是取得全局变量。所以最终需要全部改为局部变量加指针传值的方法。

但是还有一个小的竞态条件问题,就是在写入日志的时候,因为可能多线程运行的时候同时写入一个文件,所以要把写入文件的操作变成原子操作,最简单的应该就是给文件加锁了。

int log_fd = log_fp->_fileno;
if (flock(log_fd, LOCK_EX) == 0)
{
    if (write(log_fd, buffer, count) < 0)
    {
        perror("write error");
        exit(1);
    }
    flock(log_fd, LOCK_UN);
}
else
{
    perror("flock error");
    exit(1);
}

具体用法是 http://man7.org/linux/man-pages/man2/flock.2.html

当然还可以在写文件的时候,使用自旋锁等轻量级的锁,毕竟这个写几行日志是很快的操作,如果使用了信号量之类的睡眠锁,就有点重量级了。

RAID

今天给一台IBM x3850 x6装系统,首先要进入BIOS设置中组RAID,服务器共有4块硬盘,可选的有RAID0、RAID1和RAID5。

RAID0是整个逻辑盘的数据是被分条分布在多个磁盘上,可以并行读/写,提供最快的速度,但没有冗余能力。

RAID1只有一半的磁盘容量是有效的,可以认为一半读写数据,一半备份数据,有冗余能力。

RAID5把数据和相对应的奇偶校验信息存储到组成RAID5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上,其中任意N-1块磁盘上都存储完整的数据。

网卡

还是上面的服务器,网卡不能用,ifconfig -a能看到,有4块网卡,但是直接运行ifup 网卡名提示出错。

发现/etc/network/interfaces中根本没有配置,然后添加了

auto p10p1
iface p10p1 inet dhcp

后再启用就好了。

git使用GPG签名

生成gpg key

运行gpg --gen-key前面选项可以保持默认,最后填写你的名字和邮箱。注意邮箱要和Github等平台上的一致。

导出key,添加到Github

运行gpg --list-keys就可以看到你的key id了。类似

pub   2048R/779EEEEE 2016-04-21
uid                  LiYang <user@example.com>
sub   2048R/88EEEEE 2016-04-21

下文使用{KEY ID}代替779EEEEE

然后运行gpg --armor --export {KEY ID}就可以看到-----BEGIN PGP PUBLIC KEY BLOCK-----开头的一堆字符串了,复制出来,添加到Github。

设置git

运行git config user.signingkey {KEY ID}

设置git commit默认签名

运行git config commit.gpgsign true这就相当于每次commit的时候就添加-S参数。-s参数没找到默认设置项目,这个可以显示Signed-off-by

git tag也是使用-s参数,没有找到默认设置。

请输入图片描述

其他

  • git log --show-signature 查看带签名的log
  • git mergegit pull 可以使用 --verify-signatures

WordPress和Typecho xmlrpc漏洞

一般大家都关注WordPress,毕竟用户量巨大,而国内的Typecho作为轻量级的博客系统就关注的人并不多。Typecho有很多借鉴WordPress的,包括兼容的xmlrpc接口,而WordPress的这个接口爆出过多个漏洞,Typecho无一幸免。

账号密码爆破

WordPress的相关漏洞可以参考 https://blog.cloudflare.com/a-look-at-the-new-wordpress-brute-force-amplification-attack/ 这个漏洞在Typecho上要危害稍微小一点,因为WordPress是有破解保护的,而这个接口可以绕过这个保护,Typecho并没有这个保护,只要暴露了后台地址就然并卵了。但是我采用了后台登录的两步验证,这个接口接口确实绕过了两步验证。

POC

curl "https://example.com/action/xmlrpc" -d '<?xml version="1.0" encoding="UTF-8"?><methodCall><methodName>wp.getUsersBlogs</methodName><params><param><value>{USERNAME}</value></param><param><value>{PASSWORD}</value></param></params></methodCall>'

Ping back造成的dos和SSRF

WordPress会尝试去访问Ping back的url,可能会造成dos问题。参考http://www.acunetix.com/blog/articles/wordpress-pingback-vulnerability/

同时,没有对url进行校验,可以用来扫描内网。

WordPress后来修补了SSRF的问题,后来被绕过,前几天刚刚重新修复,见 http://xlab.baidu.com/wordpress/。但是Typecho没有任何过滤。

POC

curl "https://example.com/action/xmlrpc" -d '<methodCall><methodName>pingback.ping</methodName><params><param><value><string>http://victim.com</string></value></param><param><value><string>https://example.com/index.php/archives/732/</string></value></param></params></methodCall>'

看到了xml,还顺手测试了一把xxe,不过暂时没有发现这个问题。解析xml时候的本地拒绝服务是存在的,Inutio XML-RPC Library的问题,有两个CVE。

解决方案

nginx屏蔽此url

if ($uri ~ ^/index.php/action/xmlrpc) {
    return 403;
}

运营商劫持造成的风险案例

山东移动在使用3/4G的时候,会在网页中插入一段js,然后在网页右下角显示一个流量球,显示你当前剩余流量,点击流量球还可以办理业务。

请输入图片描述

请输入图片描述

但是在使用jsonp查询的时候没有进行有效的安全校验,导致用户在使用3/4G的时候该接口可以被任意网页js调用,可以获取用户手机号码,当前已经办理的业务,当前的套餐情况,办理各种套餐等。当然这里除了对手机号打码之外也没有别的办法进行校验,毕竟是插入到别人的页面的,校验referer肯定不行。

阅读全文...