美文网首页
sqli-labs基础(一)

sqli-labs基础(一)

作者: pigdaqiang | 来源:发表于2020-01-12 21:53 被阅读0次

基础知识

常见的系统函数

  1. version() 查看数据库版本
  2. user() 数据库用户
  3. database() 数据库名
  4. @@datadir 数据库路径
  5. @@version_compile_os 操作系统版本

字符串链接函数

  1. concat(str1, str2,....) 没有分割的链接字符串

  2. concat_ws(separator, str1, str2, ...) 含有分割符链接字符串

  3. group_concat(str1, str2,...) 链接一个组所有字符串, 并以逗号分隔每一条数据

    这三个函数可以一次性的查出所有信息(limit 0,1 是一个一个 的查询)

常见的闭合字符

--+ 可以使用#, 来代替或者亦可以使用%23来代替

or 1=1 --+
‘or 1=1 --+
“or 1=1 --+
)or 1=1 --+
')or 1=1 --+
”)
“))

一般代码为:

$id=#_GET['id'];
$sql="SELECT * REOM users WHERE id='$id' LIMIT 0,1";

这个主要两个方向解决一、闭合前面的’ 二、闭合后面的引号或者注释掉,注释符(#, %23, --+)

union的使用

union操作符用于合并两个或者多个select语句结果集。union内部的语句必须拥有相同数量的列,同时列也必须要有相似的数据类型。每条select语句中的列的顺序必须相同。

sql union 语法:

SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

默认的,union操作符选取不同的值,如果允许重复的值,使用UNION ALL

SQL UNION ALL语法

SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2

union 结果集中的列名总是等于union中第一个select语句中的列名

sql逻辑运算

​ select * from users where id=1 and 1=1;

​ select * from admin where username='admin' and password='admin' # 这里可以 使用‘or 1=1#来登录

在sql中and的运算优先级大于or

select * from adin where username='admin' and password=' ' or 1=1

在执行第一个and运算后得到false, false or 1=1 得到true ,因为1=1恒成立。所以语句最终为true

1 select * from users where id=1 and 1=1;

2 select * from users where id=1 && and 1=1;

3 select * from users where id=1 & 1=1;

上述3个查询语句 其中1,2 都是表达id=1 和1=1条件进行与运算。

3的意思是id=1 条件与1 进行& 位操作,id=1 作为true,与1进行&运算结果还是1,再进行=操作,1=1,还是1(其中&的优先级大于=)

此处进行的位运算,可以将数转换为二进制再进行与,或,非,异或等运算。可以利用改方法进行注入。列如将字符转换为ascii后,可以分别与1,2,4,8,16,32...进行与运算,可以得到每一位的值,凭借起来就是ascii的值,再反推会字符

注入流程

graph LR
A[数据库] -->B(数据表)
    B -->E(字段名)
        E -->F(数据)
A -->C(数据表)
    C -->column2(字段名)
        column2 -->data(数据)
A -->D(...)

数据库存储数据如同上图,每个库中存着许多表,每个表中有着许多字段,每个字段中存着对应的数据

mysql的基本操作:

mysql 登录:

​ mysql -u username -p password -h IP -P port

mysql -u 用户名 -p直接加密码 或者mysql -u 用户名 -p
密码换行输入
-h 数据库IP地址,默认127, localhost
-P 端口号

查看数据库:show databases;

使用数据库:use 数据库名;

查看数据表: show tables;

查看表的结构: desc 表名;

查询语句: select table_name from information_schema.tables where table_schema = "security";

mysql 有一个系统数据库information_schema,存储着所有的数据库相关信息,一般的,可以利用该表进行一次完整的注入。一般流程如下:

猜数据库:

select schema_name from information_schema.schemata

猜某库的数据表:

select table_name from information_schema.tables where table_schema='xxxxx'; 这里的xxx同样可以使用十六进制编码来代替

猜数据表的字段:

select column_name from information_schema.columns where table_name='xxx'; # 这里的‘xxx’同样可以使用十六进制来代替。

获取字段的内容:

select xxx from xxx

参考文章
sql注入天书,以及各位大佬blog

相关文章

网友评论

      本文标题:sqli-labs基础(一)

      本文链接:https://www.haomeiwen.com/subject/bzmwactx.html