1- from utils .groq_utils import get_groq_response
1+ from utils .ai_providers import ai_manager , AIProvider
22from sqlmap_ai .ui import print_info , print_warning , print_success
33from sqlmap_ai .parser import extract_sqlmap_info
44import json
5- def ai_suggest_next_steps (report , scan_history = None , extracted_data = None ):
5+ import asyncio
6+ def ai_suggest_next_steps (report , scan_history = None , extracted_data = None , ai_provider = None , use_advanced = None ):
67 print_info ("Analyzing SQLMap results with AI..." )
78 if not report :
89 return ["--technique=BT" , "--level=2" , "--risk=1" ]
910 if report .startswith ("TIMEOUT_WITH_PARTIAL_DATA:" ):
1011 report = report [len ("TIMEOUT_WITH_PARTIAL_DATA:" ):]
1112 structured_info = extract_sqlmap_info (report )
12- prompt = create_advanced_prompt (report , structured_info , scan_history , extracted_data )
13- print_info ("Sending detailed analysis request to Groq AI..." )
14- response = get_groq_response (prompt = prompt )
15- if not response :
13+
14+ # Determine which prompt to use based on provider and user preference
15+ use_simple = False
16+
17+ # Default behavior: simple for Ollama, advanced for others
18+ if ai_provider == AIProvider .OLLAMA or ai_provider == "ollama" :
19+ use_simple = True
20+
21+ # Override based on user preference
22+ if use_advanced is not None :
23+ use_simple = not use_advanced
24+
25+ if use_simple :
26+ prompt = create_simple_prompt (report , structured_info , scan_history , extracted_data )
27+ print_info ("Using simple prompt for AI analysis" )
28+ else :
29+ prompt = create_advanced_prompt (report , structured_info , scan_history , extracted_data )
30+ print_info ("Using advanced prompt for AI analysis" )
31+
32+ # Determine which AI provider to use
33+ provider_name = "AI"
34+ if ai_provider :
35+ provider_name = ai_provider .upper ()
36+ print_info (f"Sending detailed analysis request to { provider_name } ..." )
37+
38+ # Use the AI provider system
39+ try :
40+ # Convert string provider to AIProvider enum if needed
41+ provider_enum = None
42+ if ai_provider :
43+ try :
44+ provider_enum = AIProvider (ai_provider )
45+ print_info (f"Using AI provider: { provider_enum } " )
46+ except ValueError :
47+ print_warning (f"Invalid AI provider: { ai_provider } " )
48+ return ["--technique=BEU" , "--level=3" ]
49+
50+ response = asyncio .run (ai_manager .get_response (prompt , provider = provider_enum ))
51+ if response and response .success :
52+ response_text = response .content
53+ else :
54+ print_warning (f"AI provider { ai_provider } failed: { response .error if response else 'Unknown error' } " )
55+ return ["--technique=BEU" , "--level=3" ]
56+ except Exception as e :
57+ print_warning (f"AI analysis failed: { e } " )
58+ return ["--technique=BEU" , "--level=3" ]
59+ if not response_text :
1660 print_warning ("AI couldn't suggest options, using fallback options" )
1761 return ["--technique=BEU" , "--level=3" ]
1862 print_success ("Received AI recommendations!" )
1963 try :
2064 # Try parsing JSON responses
21- if "```json" in response :
22- json_start = response .find ("```json" ) + 7
23- json_end = response .find ("```" , json_start )
24- json_str = response [json_start :json_end ].strip ()
65+ if "```json" in response_text :
66+ json_start = response_text .find ("```json" ) + 7
67+ json_end = response_text .find ("```" , json_start )
68+ json_str = response_text [json_start :json_end ].strip ()
2569 recommendation = json .loads (json_str )
2670 if "sqlmap_options" in recommendation :
2771 return recommendation ["sqlmap_options" ]
2872 elif "options" in recommendation :
2973 return recommendation ["options" ]
3074 # Look for code blocks without json tag
31- elif "```" in response :
32- code_start = response .find ("```" ) + 3
33- code_end = response .find ("```" , code_start )
34- code_block = response [code_start :code_end ].strip ()
75+ elif "```" in response_text :
76+ code_start = response_text .find ("```" ) + 3
77+ code_end = response_text .find ("```" , code_start )
78+ code_block = response_text [code_start :code_end ].strip ()
3579 # Check if content is JSON
3680 try :
3781 recommendation = json .loads (code_block )
@@ -44,7 +88,7 @@ def ai_suggest_next_steps(report, scan_history=None, extracted_data=None):
4488
4589 # Extract options from the response text
4690 options = []
47- for line in response .split ('\n ' ):
91+ for line in response_text .split ('\n ' ):
4892 line = line .strip ()
4993 if line .startswith ('--' ) or line .startswith ('-p ' ) or line .startswith ('-D ' ) or line .startswith ('-T ' ) or \
5094 line .startswith ('--data=' ) or line .startswith ('--cookie=' ) or line .startswith ('--headers=' ) or \
@@ -58,7 +102,7 @@ def ai_suggest_next_steps(report, scan_history=None, extracted_data=None):
58102 print_warning (f"Error parsing AI response: { str (e )} " )
59103 # Fallback to simple extraction
60104 options = []
61- for line in response .strip ().split ('\n ' ):
105+ for line in response_text .strip ().split ('\n ' ):
62106 for part in line .split ():
63107 if part .startswith ('--' ) or part .startswith ('-p ' ) or part .startswith ('-D ' ) or part .startswith ('-T ' ) or \
64108 part .startswith ('--data=' ) or part .startswith ('--cookie=' ) or part .startswith ('--headers=' ) or \
@@ -126,6 +170,35 @@ def ai_suggest_next_steps(report, scan_history=None, extracted_data=None):
126170 return ["--technique=BEU" , "--level=3" ]
127171
128172 return valid_options
173+
174+ def create_simple_prompt (report , structured_info , scan_history = None , extracted_data = None ):
175+ """Create a simpler prompt for Ollama to avoid timeouts"""
176+ prompt = """
177+ You are a SQLMap expert. Analyze this SQL injection scan result and suggest the next steps.
178+
179+ DBMS: {dbms}
180+ Vulnerable Parameters: {vulnerable_params}
181+ Databases Found: {databases}
182+
183+ Based on this information, suggest the next SQLMap options to use. Focus on:
184+ 1. Extracting more database information
185+ 2. Using conservative settings to prevent timeouts
186+ 3. Using specific techniques rather than broad scanning
187+
188+ Return your recommendation as a simple list of options, one per line:
189+ --level=2
190+ --risk=1
191+ --dbs
192+ """
193+
194+ formatted_prompt = prompt .format (
195+ dbms = structured_info .get ("dbms" , "Unknown" ),
196+ vulnerable_params = ', ' .join (structured_info .get ("vulnerable_parameters" , [])) or "None" ,
197+ databases = ', ' .join (structured_info .get ("databases" , [])) or "None"
198+ )
199+
200+ return formatted_prompt
201+
129202def create_advanced_prompt (report , structured_info , scan_history = None , extracted_data = None ):
130203 prompt = """
131204 You are a SQLMap expert. You are given a SQLMap scan report and a list of previous scan steps.
0 commit comments