Tainted flow: 'topic_url' from input (line 15, user input) → requests.get (network output)
Medium
- Category
- Data Flow
- Content
print(f"Scraping topic: {topic_id}") # Fetch first page to auto-detect total pages r = requests.get(topic_url) soup = BeautifulSoup(r.content, 'html5lib') last_offsets = re.findall(r'/topic/' + topic_id + r'/\+(\d+)', str(soup)) if last_offsets:- Confidence
- 95% confidence
- Finding
- The script sends unvalidated user-controlled input directly into requests.get, so an operator can make it connect to arbitrary URLs rather than only Lowyat forum pages. In an agent or automated environment this creates an SSRF-style primitive that can be abused to reach internal services, cloud metadata endpoints, or unexpected hosts, and the skill context makes this more concerning because it is marketed as Lowyat-only research but does not enforce that restriction.
